java excel到csv文件转换

我试图将.xlsx文件转换为.csv,转换正在发生,但数据格式不正确。 请在下面find代码并build议更改代码。

在这里,我正在尝试读取一个.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); } } 

尝试改变你的代码到这个新的行char必须追加一行读后

 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'); } 

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

 data.append('\n'); 

你需要在每一行之后做。

还要注意,你最好使用正确的CSV库进行序列化,因为它会正确处理转义string。

相当一个旧的post,但会帮助某人..与多张表。

 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); } } 

尝试这个 :

 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(); }