尝试在JAVA中将数据写入多个工作表时,XLSX文件被损坏

我是JAVA新手。 我有一个要求将一个特定的文件夹中的多个文件加载到Excel的xlsx(不是xls文件,因为input文件有超过65klogging)文件不同的工作表。 下面是我写的代码。 xlsx文件被损坏,不能打开。 你能帮忙吗?

public class twotxttoxlsx{ public static void main(String[]args){ try{ File folder = new File("C:/txttoxls/"); File[] listOfFiles = folder.listFiles(); XSSFWorkbook workbook=new XSSFWorkbook(); for (File file : listOfFiles) { if (file.isFile()) { String thisline; ArrayList<String> al = null; ArrayList<ArrayList<String>> arlist = new ArrayList<ArrayList<String>>(); XSSFSheet sheet = workbook.createSheet(file.getName()); FileInputStream fis = new FileInputStream(file); System.out.println("Got here"); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); while ((thisline = br.readLine()) != null) { al = new ArrayList<String>(); String strar[] = thisline.split("#"); for (int j = 0; j < strar.length; j++) { for (int k = 0; k < arlist.size(); k++) { ArrayList<String> ardata = (ArrayList<String>) arlist.get(k); XSSFRow row = sheet.createRow((short) k); for (int p = 0; p < ardata.size(); p++) { XSSFCell cell = row.createCell((short) p); cell.setCellValue(ardata.get(p).toString()); } } al.add(strar[j]); } arlist.add(al); } fis.close(); FileOutputStream fileOut = new FileOutputStream("C:/txttoxls/Test.xlsx"); workbook.write(fileOut); fileOut.flush(); fileOut.close(); br.close(); } } System.out.println("Your excel file has been generated!"); } catch ( Exception ex ) { System.out.println(ex); } } } 

在4月27日编辑:工作代码但存在性能问题。

  import java.io.*; import java.util.ArrayList; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFCell; public class createXLSXfileTest{ public static void main(String[]args){ XSSFWorkbook workbook=new XSSFWorkbook(); XSSFSheet sheet = (XSSFSheet) workbook.createSheet("sheet1"); XSSFSheet sheet1 = (XSSFSheet) workbook.createSheet("Sheet2"); try{ File file = new File("C:/Users/Desktop/file1.txt"); FileOutputStream fileOut = new FileOutputStream("C:/Users/Desktop/test.xlsx"); if (file.isFile()) { String thisline; ArrayList<String> al = null; ArrayList<ArrayList<String>> arlist = new ArrayList<ArrayList<String>>(); FileInputStream fis = new FileInputStream(file); System.out.println("loading 1st file"); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); while ((thisline = br.readLine()) != null) { al = new ArrayList<String>(); String strar[] = thisline.split("#"); for (int j = 0; j < strar.length; j++) { for (int k = 0; k < arlist.size(); k++) { ArrayList<String> ardata = (ArrayList<String>) arlist.get(k); XSSFRow row = sheet.createRow((short) k); for (int p = 0; p < ardata.size(); p++) { XSSFCell cell = row.createCell((short) p); cell.setCellValue(ardata.get(p).toString()); } } al.add(strar[j]); } arlist.add(al); } fis.close(); } File file1 = new File("C:/Users/Desktop/file2.txt"); if (file1.isFile()) { String thisline; ArrayList<String> al = null; ArrayList<ArrayList<String>> arlist = new ArrayList<ArrayList<String>>(); FileInputStream fis = new FileInputStream(file1); System.out.println("loading 2nd file"); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); while ((thisline = br.readLine()) != null) { al = new ArrayList<String>(); String strar[] = thisline.split("#"); for (int j = 0; j < strar.length; j++) { for (int k = 0; k < arlist.size(); k++) { ArrayList<String> ardata = (ArrayList<String>) arlist.get(k); XSSFRow row = sheet1.createRow((short) k); for (int p = 0; p < ardata.size(); p++) { XSSFCell cell = row.createCell((short) p); cell.setCellValue(ardata.get(p).toString()); } } al.add(strar[j]); } arlist.add(al); } fis.close(); workbook.write(fileOut); fileOut.flush(); fileOut.close(); br.close(); System.out.println("Your excel file has been generated!"); }} catch ( Exception ex ) { System.out.println(ex); } } } 

我唯一能看到的是你的表名可能是一个问题。

XSSFSheet sheet = workbook.createSheet(file.getName());

Excel工作表名称是非常严格的。 最大长度31,许多特殊字符不允许,包括/[]:\? 还有很多。 考虑写一个“toWorksheetName”函数来将文件名清理成合法的工作表名称。

你可以尝试的另一件事是尝试阅读与POI的XLS。 这可能有助于缩小问题的范围。 帮助在这里 ,在“使用.xlsx文件”下。

在旁边注意:您不需要closuresfis ; closuresbr就够了。 Close()从装饰器传递到包装的stream。 这不会破坏任何东西。