【问题标题】:java excel to csv file convertjava excel到csv文件的转换
【发布时间】:2014-05-22 09:50:02
【问题描述】:

我正在尝试将 .xlsx 文件转换为 .csv,正在转换但数据格式不正确。请在下面找到代码并建议对代码进行更改。

在这里,我试图读取 .xlsx 文件并将其写入 csv 文件,即将 xlsx 转换为 csv,但我没有以正确格式获取 .csv 文件,所有数据都显示在一个单一但它必须显示为Excel 中的行。

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.Row;

class XlstoCSV 

{

   static void xls(File inputFile, File outputFile) 

{

    // For storing data into CSV files
    StringBuffer data = new StringBuffer();
    try 
    {
    FileOutputStream fos = new FileOutputStream(outputFile);

    // Get the workbook object for XLS file
    HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(inputFile));
    // Get first sheet from the workbook
    HSSFSheet sheet = workbook.getSheetAt(0);
    Cell cell;
    Row row;

    // Iterate through each rows from first sheet
    Iterator<Row> rowIterator = sheet.iterator();
    while (rowIterator.hasNext()) 
    {
            row = rowIterator.next();
            // For each row, iterate through each columns
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) 
            {
                    cell = cellIterator.next();

                    switch (cell.getCellType()) 
                    {
                    case Cell.CELL_TYPE_BOOLEAN:
                            data.append(cell.getBooleanCellValue() + ",");
                            break;

                    case Cell.CELL_TYPE_NUMERIC:
                            data.append(cell.getNumericCellValue() + ",");
                            break;

                    case Cell.CELL_TYPE_STRING:
                            data.append(cell.getStringCellValue() + ",");
                            break;

                    case Cell.CELL_TYPE_BLANK:
                            data.append("" + ",");
                            break;

                    default:
                            data.append(cell + ",");
                    }

                    data.append('\n'); 
            }
    }

    fos.write(data.toString().getBytes());
    fos.close();
    }
    catch (FileNotFoundException e) 
    {
            e.printStackTrace();
    }
    catch (IOException e) 
    {
            e.printStackTrace();
    }
    }

    public static void main(String[] args) 
    {
            File in`enter code here`putFile = new File("C:\test.xls");
            File outputFile = new File("C:\output.csv");
            xls(inputFile, outputFile);
    }
}

【问题讨论】:

  • 请提供输入样本、所需输出以及您实际得到的结果。
  • excel 中的行必须在 csv i 中显示相似,例如,如果我在 excel 中有 10 行,我应该在 csv 中获得 10 行,但上面的代码是将所有 10 行添加到单个中,我想要它也可以在 csv 的行中添加
  • 我们需要查看输出文件。您最好使用适当的 CSV 库进行序列化,因为它将正确处理转义字符串。

标签: java excel csv


【解决方案1】:

问题是你在每个单元格后添加一个新行,这里:

data.append('\n'); 

你需要在每一行之后都这样做。

另请注意,您最好使用适当的 CSV 库进行序列化,因为它可以正确处理转义字符串。

【讨论】:

    【解决方案2】:

    尝试将您的代码更改为此 您的新行字符必须在读取一行后附加

    while (rowIterator.hasNext()) 
    {
            row = rowIterator.next();
            // For each row, iterate through each columns
            Iterator<Cell> cellIterator = row.cellIterator();
            while (cellIterator.hasNext()) 
            {
                    cell = cellIterator.next();
    
                    switch (cell.getCellType()) 
                    {
                    case Cell.CELL_TYPE_BOOLEAN:
                            data.append(cell.getBooleanCellValue() + ",");
                            break;
    
                    case Cell.CELL_TYPE_NUMERIC:
                            data.append(cell.getNumericCellValue() + ",");
                            break;
    
                    case Cell.CELL_TYPE_STRING:
                            data.append(cell.getStringCellValue() + ",");
                            break;
    
                    case Cell.CELL_TYPE_BLANK:
                            data.append("" + ",");
                            break;
    
                    default:
                            data.append(cell + ",");
                    }
    
    
            }
      data.append('\n'); 
    }
    

    【讨论】:

      【解决方案3】:

      相当老的帖子,但会帮助某人.. 多张纸。

      import java.io.BufferedWriter;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.OutputStream;
      import java.io.OutputStreamWriter;
      import java.util.Iterator;
      
      import org.apache.poi.hssf.usermodel.HSSFSheet;
      import org.apache.poi.hssf.usermodel.HSSFWorkbook;
      import org.apache.poi.ss.usermodel.Cell;
      import org.apache.poi.ss.usermodel.Row;
      
      class XlStoCSV {
          static void xls(File inputFile) {
              // Get the workbook object for XLS file
              int count = 0;
              try {
      
                  HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(
                          inputFile));
                  for (int l = workbook.getNumberOfSheets() - 1; l >= 0; l--) {
                      File outputFile = new File(System.getProperty("user.dir")
                              + "/output/"+inputFile.getName()+"-"+workbook.getSheetName(count) +".csv");
      
                      // For storing data into CSV files
                      StringBuffer data = new StringBuffer();
                      FileOutputStream fos = new FileOutputStream(outputFile);
                      HSSFSheet sheet = workbook.getSheetAt(count);
                      Cell cell;
                      Row row;
      
                      // Iterate through each rows from first sheet
                      Iterator<Row> rowIterator = sheet.iterator();
                      while (rowIterator.hasNext()) {
                          row = rowIterator.next();
                          // For each row, iterate through each columns
                          Iterator<Cell> cellIterator = row.cellIterator();
                          int columnNumber = 1;
                          while (cellIterator.hasNext()) {
                              cell = cellIterator.next();
                              if (columnNumber > 1)
                              {
                                  data.append(",");
                              }
      
                              switch (cell.getCellType()) {
                              case Cell.CELL_TYPE_BOOLEAN:
                                  data.append(cell.getBooleanCellValue());
                                  break;
      
                              case Cell.CELL_TYPE_NUMERIC:
                                  data.append(cell.getNumericCellValue() );
                                  break;
      
                              case Cell.CELL_TYPE_STRING:
                                  data.append(cell.getStringCellValue());
                                  break;
      
                              case Cell.CELL_TYPE_BLANK:
                                  data.append("");
                                  break;
      
                              default:
                                  data.append(cell);
                              }
                               ++columnNumber;
                          }
                          data.append('\n');
                      }
      
                      fos.write(data.toString().getBytes());
                      fos.close();
                      count++;
                  }
              } catch (FileNotFoundException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      
          public static void main(String[] args) {
              File inputFile = new File(System.getProperty("user.dir") + "/assets/"
                      + "test.xls");
              xls(inputFile);
          }
      }
      

      【讨论】:

        【解决方案4】:

        试试这个:

        public String convertRowContentToCSV(Row row) {
                Iterator<Cell> cellIterator = row.cellIterator();
                StringBuilder data = new StringBuilder();
                while (cellIterator.hasNext()) {
                    Cell cell = cellIterator.next();
        
                    switch (cell.getCellTypeEnum()) {
                        case BOOLEAN:
                            data.append(cell.getBooleanCellValue()).append(",");
                            break;
        
                        case NUMERIC:
                            data.append(cell.getNumericCellValue()).append(",");
                            break;
        
                        case STRING:
                            data.append(cell.getStringCellValue()).append(",");
                            break;
        
                        case BLANK:
                            data.append(",");
                            break;
        
                        case FORMULA:
                        case _NONE:
                        case ERROR:
                            break;
        
                        default:
                            data.append(cell).append(",");
                    }
        
                }
                return data.toString();
            }
        

        【讨论】:

          【解决方案5】:

          试试这个代码:

          import java.util.*;
          import java.util.Map.Entry;
          import java.util.concurrent.TimeoutException;
          import java.util.logging.Logger;
          import java.util.logging.Level;
          import java.util.logging.Logger;
          import org.apache.poi.ss.usermodel.*;
          import org.apache.poi.hssf.usermodel.HSSFWorkbook;
          import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;
          
          public class App {
          
              public void convertExcelToCSV(Sheet sheet, String sheetName) {
                  StringBuffer data = new StringBuffer();
                  try {
                      FileOutputStream fos = new FileOutputStream("C:\\Users\\" + sheetName + ".csv");
                      Cell cell;
                      Row row;
          
                      Iterator<Row> rowIterator = sheet.iterator();
                      while (rowIterator.hasNext()) {
                          row = rowIterator.next();
                          Iterator<Cell> cellIterator = row.cellIterator();
                          while (cellIterator.hasNext()) {
                              cell = cellIterator.next();
          
                              CellType type = cell.getCellTypeEnum();
                              if (type == CellType.BOOLEAN) {
                                  data.append(cell.getBooleanCellValue() + ",");
                              } else if (type == CellType.NUMERIC) {
                                  data.append(cell.getNumericCellValue() + ",");
                              } else if (type == CellType.STRING) {
                                  data.append(cell.getStringCellValue() + ",");
                              } else if (type == CellType.BLANK) {
                                  data.append("" + ",");
                              } else {
                                  data.append(cell + ",");
                              }
                          }
                          data.append('\n');
                      }
                      fos.write(data.toString().getBytes());
                      fos.close();
                  }
                  catch (FileNotFoundException e)
                  {
                      e.printStackTrace();
                  }
                  catch (IOException e)
                  {
                      e.printStackTrace();
                  }
              }
          
              public static void main(String [] args)
              {
                  App app = new App();
                  String path =  "C:\\Users\\myFile.xlsx";
                  InputStream inp = null;
                  try {
                      inp = new FileInputStream(path);
                      Workbook wb = WorkbookFactory.create(inp);
          
                      for(int i=0;i<wb.getNumberOfSheets();i++) {
                          System.out.println(wb.getSheetAt(i).getSheetName());
                          app.convertExcelToCSV(wb.getSheetAt(i),wb.getSheetAt(i).getSheetName());
                      }
                  } catch (Exception ex) {
                      System.out.println(ex.getMessage());
                  } 
                  finally {
                      try {
                          inp.close();
                      } catch (Exception ex) {
                          System.out.println(ex.getMessage());
                      }
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-04-21
            • 1970-01-01
            • 2021-07-21
            • 1970-01-01
            • 2013-05-19
            • 1970-01-01
            • 2011-05-11
            • 2018-01-17
            • 2016-01-02
            相关资源
            最近更新 更多