尝试在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。 这不会破坏任何东西。
- 如何解决java.lang.VerifyError:org / apache / poi / xssf / usermodel / XSSFWorkbook?
- 在Apache Poi中从我导出的Excel中删除特殊字符和符号
- Java POI SS问题与Excel大纲和展开/折叠
- 写入后Excel文件损坏
- 使用Java使用Apache poi从Excel中获取数据
- Apache POI创build了以后无法打开的xlsx文件。 检测到邮政炸弹
- 从java,如何在Excel电子表格closures的情况下给出一个实例中的多个电子表格
- 使用Apache POI在Excel行中转发折叠
- Apache poi excel颜色单元格问题