我正在尝试将 .xlsx 文件转换为 .csv ,转换正在发生,但数据格式不正确。请在下面找到代码并建议更改代码。
这里我试图读取 .xlsx 文件并将其写入 csv 文件,即将 xlsx 转换为 csv < / em>但是我没有以正确的格式获取 .csv 文件所有数据都显示在一个单独但它必须显示为Excel中的行。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class XlsxtoCSV {
static void xlsx(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 XLSX file
XSSFWorkbook wBook = new XSSFWorkbook(new FileInputStream(inputFile));
// Get first sheet from the workbook
XSSFSheet sheet = wBook.getSheetAt(0);
Row row;
Cell cell;
// 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 + ",");
}
}
}
fos.write(data.toString().getBytes());
fos.close();
} catch (Exception ioe) {
ioe.printStackTrace();
}
}
//testing the application
public static void main(String[] args) {
//reading file from desktop
File inputFile = new File("C:\\Users\\user69\\Desktop\\test.xlsx");
//writing excel data to csv
File outputFile = new File("C:\\Users\\user69\\Desktop\\test1.csv");
xlsx(inputFile, outputFile);
}
}
答案 0 :(得分:12)
感谢@Swapnil!
data.append("\r\n"); // After the columns have been appended.
答案 1 :(得分:1)
使用Commons CSV对单元格值进行编码,这更加健壮。不幸的是,仍然需要一些额外的代码来迭代行/单元格的工作表并在每个单元格上调用Commons CSV(XSSF不提供该功能),但是至少要保证写入的实际单元格值是标准CSV(即您不必担心自己转义字符或添加逗号)。
为Commons CSV添加Maven:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.5</version>
</dependency>
一旦Commons CSV可用,这就是将工作簿导出到CSV的代码。此示例写入OutputStream,但是文件输出也很容易。
// Convert an XSSFWorkbook to CSV and write to provided OutputStream
private void writeWorkbookAsCSVToOutputStream(XSSFWorkbook workbook, OutputStream out) {
CSVPrinter csvPrinter = null;
try {
csvPrinter = new CSVPrinter(new OutputStreamWriter(out), CSVFormat.DEFAULT);
if (workbook != null) {
XSSFSheet sheet = workbook.getSheetAt(0); // Sheet #0 in this example
Iterator<Row> rowIterator = sheet.rowIterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
csvPrinter.print(cell.getStringCellValue());
}
csvPrinter.println(); // Newline after each row
}
}
}
catch (Exception e) {
log.error("Failed to write CSV file to output stream", e);
}
finally {
try {
if (csvPrinter != null) {
csvPrinter.flush(); // Flush and close CSVPrinter
csvPrinter.close();
}
}
catch (IOException ioe) {
log.error("Error when closing CSV Printer", ioe);
}
}
}
答案 2 :(得分:0)
public static void convertToXlsx(File inputFile, File outputFile) {
StringBuffer bf = new StringBuffer();
FileOutputStream fos = null;
String strGetValue = "";
try {
fos = new FileOutputStream(outputFile);
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(inputFile));
XSSFSheet sheet = wb.getSheetAt(0);
Row row;
Cell cell;
int intRowCounter = 0;
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
StringBuffer cellDData = new StringBuffer();
row = rowIterator.next();
int maxNumOfCells = sheet.getRow(0).getLastCellNum();
int cellCounter = 0;
while ((cellCounter) < maxNumOfCells) {
if (sheet.getRow(row.getRowNum()) != null
&& sheet.getRow(row.getRowNum()).getCell(cellCounter) != null) {
cell = sheet.getRow(row.getRowNum()).getCell(cellCounter);
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
strGetValue = cell.getBooleanCellValue() + ",";
cellDData.append(removeSpace(strGetValue));
break;
case Cell.CELL_TYPE_NUMERIC:
strGetValue = new BigDecimal(cell.getNumericCellValue()).toPlainString();
if (DateUtil.isCellDateFormatted(cell)) {
strGetValue = new DataFormatter().formatCellValue(cell);
} else {
strGetValue = new BigDecimal(cell.getNumericCellValue()).toPlainString();
}
String tempStrGetValue = removeSpace(strGetValue);
if (tempStrGetValue.length() == 0) {
strGetValue = " ,";
cellDData.append(strGetValue);
} else {
strGetValue = strGetValue + ",";
cellDData.append(removeSpace(strGetValue));
}
break;
case Cell.CELL_TYPE_STRING:
strGetValue = cell.getStringCellValue();
String tempStrGetValue1 = removeSpace(strGetValue);
if (tempStrGetValue1.length() == 0) {
strGetValue = " ,";
cellDData.append(strGetValue);
} else {
strGetValue = strGetValue + ",";
cellDData.append(removeSpace(strGetValue));
}
break;
case Cell.CELL_TYPE_BLANK:
strGetValue = "" + ",";
cellDData.append(removeSpace(strGetValue));
break;
default:
strGetValue = cell + ",";
cellDData.append(removeSpace(strGetValue));
}
} else {
strGetValue = " ,";
cellDData.append(strGetValue);
}
cellCounter++;
}
String temp = cellDData.toString();
if (temp != null && temp.contains(",,,")) {
temp = temp.replaceFirst(",,,", ", ,");
}
if (temp.endsWith(",")) {
temp = temp.substring(0, temp.lastIndexOf(","));
cellDData = null;
bf.append(temp.trim());
}
bf.append("\n");
intRowCounter++;
}
fos.write(bf.toString().getBytes());
fos.close();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
if (fos != null)
fos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
private static String removeSpace(String strString) {
if (strString != null && !strString.equals("")) {
return strString.trim();
}
return strString;
}