簡體   English   中英

嘗試在 JAVA 中將數據寫入多個工作表時,XLSX 文件損壞

[英]XLSX file getting corrupted when trying to write data into multiple sheets in JAVA

我是 JAVA 新手。 我需要將特定文件夾中的多個文件加載到 excel xlsx(不是 xls 文件,因為輸入文件有超過 65k 條記錄)文件不同的工作表。 下面是我寫的代碼。 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 文件”下。

附帶說明:您不需要關閉fis 關閉br就足夠了。 Close() 從裝飾器向下傳遞到包裝的流。 但這不會破壞任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM