2015-02-10 2 views
2

Когда я редактирую файл .xlsx с помощью Apache poi, его слишком долго нужно сохранять. Файл .xlsx содержит форму форматирования и замораживания панели. Я использую следующий код,FileOutputStream (Apachhe POI) занимает слишком много времени, чтобы сэкономить

try { 
      FileInputStream file = new FileInputStream(new File(path)); 
      XSSFWorkbook fWorkbook = new XSSFWorkbook(file); 
      XSSFSheet fSheet = fWorkbook.getSheetAt(0); 

      for(int i = 0; i < jTable1.getRowCount(); i++){ 
       if(jTable1.getModel().getValueAt(i, index1).equals("1")){ 
        XSSFCell cell = fSheet.getRow(i+1).getCell(index1); 
        cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC); 
        cell.setCellValue(new Double(1)); 
        XSSFCellStyle cs = fWorkbook.createCellStyle(); 
        cs.setDataFormat(fWorkbook.getCreationHelper().createDataFormat().getFormat("dd/MMMM/yyyy")); 
        cell =fSheet.getRow(i+1).getCell(index2); 
        cell.setCellValue(new Date()); 
        cell.setCellStyle(cs); 
       } 
      } 
      file.close(); 
      FileOutputStream fileOutputStream = new FileOutputStream(path); 
      fWorkbook.write(fileOutputStream); 
      fileOutputStream.close(); 
      JOptionPane.showMessageDialog(this, "Data saved successfully."); 
      parent.removeContent(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

Edit 1:

Файл первенствует: http://ge.tt/5orGWSJ2/v/0?c

Загрузка данных в JTable из Excel:

try { 
       FileInputStream file1 = new FileInputStream(new File("c:\\sample.xlsx")); 
       XSSFWorkbook workbook = new XSSFWorkbook(file1); 
       XSSFSheet sheet = workbook.getSheetAt(0); 
       int rowc=sheet.getLastRowNum()+1; 
       int colc=sheet.getRow(0).getLastCellNum(); 
       Object heading[] = new Object[colc+1]; 
       XSSFRow row1 = sheet.getRow(0); 
       for(int i=0, column =0; i < colc; i++){ 
        if(i == 1){ 
         heading[column++] = ""; 
        } 
        heading[column++] = cellToString(row1.getCell(i)); 
       } 
       Object [][]j=new Object[rowc-1][colc+1]; 

       for (int i = 1; i < rowc; i++) { 
        row1 = sheet.getRow(i); 
        for (int jj = 0, column = 0; jj < colc; jj++) { 
         if(column == 1){ 
          j[i-1][column++] = new Boolean(false); 
          j[i-1][column] = cellToString(row1.getCell(jj)); 
         } 
         else{ 
          j[i-1][column]=cellToString(row1.getCell(jj)); 
         } 
         column++; 
        } 
       } 

       jTable1.setModel(new DefaultTableModel(j, heading){ 
        public Class getColumnClass(int columnIndex) { 
         if(columnIndex == 0){ 
          return java.lang.Integer.class; 
         } 
         else if(columnIndex == 1){ 
          return java.lang.Boolean.class; 
         } 
         else{ 
          return java.lang.Object.class; 
         } 
        } 
       }); 

       jTable1.getColumnModel().getColumn(1).setMaxWidth(60); 
       jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
       jTable1.getTableHeader().setReorderingAllowed(false); 
      } catch (IOException ex) { 
       JOptionPane.showMessageDialog(BarcodePrint.this, ex); 
      } 

Запись данных в Excel после редактирования колонки BarcodePrint:

try { 
      FileInputStream file = new FileInputStream(new File("c:\\sample.xlsx")); 
      XSSFWorkbook fWorkbook = new XSSFWorkbook(file); 
      XSSFCellStyle cs = fWorkbook.createCellStyle(); 
      cs.setDataFormat(fWorkbook.getCreationHelper().createDataFormat().getFormat("dd/MMMM/yyyy")); 
      Date currentdate = new Date(); 
      XSSFSheet fsheet = fWorkbook.getSheetAt(0); 
      Double barcodeprintstatus = new Double(1); 
      int newindex = 24; 
      int printdate = 26; 
      int uniqueid = 27; 
      for(int i = 0; i < jTable1.getModel().getRowCount(); i++){ 
       if(jTable1.getModel().getValueAt(i, newindex).equals("1")){ 
        for(int k=1; k < fsheet.getPhysicalNumberOfRows(); k++){ 
         XSSFCell cell = fsheet.getRow(k).getCell(uniqueid-1); 
         String uid = cell.getRawValue(); 
         if(jTable1.getModel().getValueAt(i, uniqueid).toString().equals(uid)){ 
          cell = (fsheet.getRow(i+1)).getCell(newindex-1); 
          cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC); 
          cell.setCellValue(barcodeprintstatus); 
          cell = fsheet.getRow(i+1).getCell(printdate-1); 
          cell.setCellValue(currentdate); 
          cell.setCellStyle(cs); 
         } 
        } 
       } 
      } 

      file.close(); 
      FileOutputStream fileOutputStream = new FileOutputStream("c:\\sample.xlsx"); 
      fWorkbook.write(fileOutputStream); // this is taking so much of time. Approximately 1 min. 
      fileOutputStream.close(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

Я не могу решить эту проблему. fWorkbook.write(fileOutputStream); занимает столько времени, как я упоминал выше. Пожалуйста помоги. Есть ли другой способ сохранить файл excel? Или я могу писать данные частично для одного столбца, а не из книги с отверстиями?

+0

После какого-то проб и ошибок я обнаружил, что fWorkbook.write (fileOutputStream); все это время занимает. Есть ли способ минимизировать это? –

+0

Вы пытаетесь сохранить весь лист. Если вы хотите сохранить только выбранные строки, вы должны сохранить только выбранные строки, а не весь лист. Это снизит потребление времени и ресурсов. – guptakvgaurav

+0

Файл, который я использую для редактирования, имеет только 325 КБ и содержит только 12 строк с 50 столбцами. И его занимает примерно 39 секунд. –

ответ

1

Попробуйте улучшить код.

Вы звоните fSheet.getRow(i+1) дважды. Попробуйте ввести переменную и повторно использовать строку, а не получить ее.

cell.setCellValue(new Double(1)); 

Создайте 1 двойной раз перед циклом for и повторно используйте его.

XSSFCellStyle cs = fWorkbook.createCellStyle(); 
cs.setDataFormat(fWorkbook.getCreationHelper().createDataFormat().getFormat("dd/MMMM/yyyy")); 

Переместить создание стиля ячейки и инициализацию из цикла for. Создайте его перед циклом и повторным использованием.

cell.setCellValue(new Date()); 

Внесите переменную Date и создайте дату только один раз. Снова перед циклом for.

+0

Сэр, как вы предположили, я сделал то, что он все еще придерживался такого же количества времени. После какой-то проб и ошибок я обнаружил, что fWorkbook.write (fileOutputStream); все это время занимает. Есть ли способ минимизировать это? –

+0

Что делать, если вы заменили fileOutputStream на ByteArrayOutputStream? Он работает быстрее? – StanislavL

+0

Я сильно чувствую, что проблема связана с размером файлаOutputStream. Больший размер потока больше времени записи операции. Первой проверкой было бы «проверить, нужно ли мне сохранять целые данные? Я переписываю одни и те же значения. '. – guptakvgaurav

0

Добавить BufferedOutputStream вокруг FileOutputStream.

+0

Он по-прежнему занимает такое же количество времени, что и раньше. –

Смежные вопросы