簡體   English   中英

我如何使用jxl定期刷新Excel中的行,同時最后關閉

[英]How do i periodically flush the rows in excel using jxl while do the close at the last

下面是我的代碼。 我首先在init方法中創建標頭。 然后在pushData中填充行。 問題是,一旦我在init方法中編寫並刷新了,Excel表格中就沒有其他內容了。

我要寫給excel的行可能很大。 使用刷新的想法不是定期釋放內存。

請告訴我我在這里犯什么錯誤。 我如何實現我的意圖?l

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;




public class ExportTranscriptDetailsToExcel implements IExportToFormat {
    private static final ILogger logger = ILabsPlatform.getLogger(ExportTranscriptDetailsToExcel.class.getName());
    OutputStream outputStream;
    List<String> labels;
    WritableWorkbook workbook;
    WritableSheet sheet0;

    public ExportTranscriptDetailsToExcel() {
        this.outputStream = null;
        workbook = null;
        sheet0 = null;
    }

    @Override
    public void init(String sheetName, List<String> labels, OutputStream outputStream) throws IOException,
            RowsExceededException, WriteException {
        this.outputStream = outputStream;
        this.labels = labels;

        WorkbookSettings workbookSettings = new WorkbookSettings();
        workbookSettings.setEncoding("Cp1252");
        workbook = Workbook.createWorkbook(outputStream, workbookSettings);

        sheet0 = workbook.createSheet(sheetName, 0);

        for (int i = 0; i < labels.size(); ++i) {
            Label label = new Label(i, 0, labels.get(i));
            sheet0.addCell(label);
        }
        workbook.write();
        outputStream.flush();
    }

    @Override
    public void pushDataRows(Object listOfResultRow) {
        if ((listOfResultRow == null)) {
            return;
        }
        String fieldName = null;
        String fieldValue = null;

        @SuppressWarnings("unchecked")
        ArrayList<Map<String, Object>> interactionMap = (ArrayList<Map<String, Object>>) listOfResultRow;
        try {
            int i = 1;// the data rows starts from row1
            for (Map<String, Object> element : interactionMap) {
                for (int j = 0; j < labels.size(); j++) {
                    fieldName = labels.get(j);
                    Object ob = element.get(fieldName);
                    if (ob != null) {
                        fieldValue = ob.toString();
                    }
                    if (fieldValue == null) {
                        fieldValue = "-";
                    }
                    System.out.println("***********************fieldName:" + fieldName);
                    System.out.println("***********************fieldValue:" + fieldValue);
                    Label label1 = new Label(j, i, fieldValue);
                    fieldValue = null;
                    sheet0.addCell(label1);
                }
                i++;
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        try {
            workbook.write();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            outputStream.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    @Override
    public void done() {
        try {
            workbook.close();
        } catch (WriteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

這里的建議

要解決內存問題,可以向jxl發信號,使其在寫入時使用臨時文件。 這將在執行期間將數據寫入臨時文件,而不是將其存儲在內存中。

您需要調整您的WorkbookSettings:

workbookSettings.setUseTemporaryFileDuringWrite(true);
workbookSettings.setTemporaryFileDuringWriteDirectory(new File("your_temporary_directory"));

將上面的your_temporary_directory替換為您喜歡的臨時目錄

另請注意,此功能在jxl版本> = 2.6.9中可用

我想我的代碼發現了問題。 這只是一時的嘗試,我當然需要有人告訴我我是否正確。

在init方法中,如果僅執行outputStream.flush(),則不會出現問題。 我認為做一個workbook.write()會關閉流以進行進一步的編寫。

所以基本上,每次要從內存中清空時,都要做outputStream.flush()。

最后做workbook.write()和workbook.close()

暫無
暫無

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

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