簡體   English   中英

帶有 useMergedCells 的 APACHE POI autoSizeColumn 太慢

[英]APACHE POI autoSizeColumn with useMergedCells too slow

我嘗試在 Excel 工作表上應用 autoSizeColumn。 我正在使用 POI 3.10.1。
我在最后應用了 autoSizeColumn 但問題是這個過程太慢/太長了:在工作表上我大約有 1000 行和 20 列...... 5 小時后,我終止了這個過程......
我不明白為什么要花這么長時間,1000 行和 20 列看起來並不那么大:我錯過了什么嗎? (注意:在較小的文件上,它正在工作)
我的簡化代碼如下:

    Workbook vWorkbook = getWorkbook();

    Sheet vSheet = vWorkbook.createSheet("sheet");
    CreationHelper vHelper = vWorkbook.getCreationHelper();
    Drawing drawing = vSheet.createDrawingPatriarch();

    Set<CellRangeAddress> vRegions = new HashSet<CellRangeAddress>();

    //Parcours des lignes du document
    MatrixDocument vMatrixDocument = getMatrixDocument();
    List<MatrixRow> vListMatrixRows = vMatrixDocument.getRows();
    int maxColNb = 0;

    //Parcours des lignes de la grille.
    for (MatrixRow vMatrixRow : vListMatrixRows)
    {
        //(...)
        //create cells 
        //(...)
    }

    initColSpan(vListMatrixRows, vRegions);

    //Gestion des colSpan et des RowSpan
    for (CellRangeAddress vRegion : vRegions)
    {
        vSheet.addMergedRegion(vRegion);
    }

    for (int i = 0; i < maxColNb; ++i)
    {
        vSheet.autoSizeColumn(i, true);//Here the problem. spent more than 5 hour for 1000 lines and 20 columns
    }

我已經閱讀了以下主題:

    http://stackoverflow.com/questions/16943493/apache-poi-autosizecolumn-resized-incorrectly
    http://stackoverflow.com/questions/15740100/apache-poi-autosizecolumn-not-working-right
    http://stackoverflow.com/questions/23366606/autosizecolumn-performance-effect-in-apache-poi
    http://stackoverflow.com/questions/18984785/a-poi-related-code-block-running-dead-slow
    http://stackoverflow.com/questions/28564045/apache-poi-autosizecolumn-behaving-weird
    http://stackoverflow.com/questions/18456474/apache-poi-autosizecolumn-is-not-working

但沒有一個能解決我的問題。
任何想法 ? PS:我嘗試上傳 Excel 文件的示例圖像,但我不知道如何上傳。

即使在使用 Apache POI 3.12 之后,我在自動調整大小方面也面臨同樣的問題。 自動調整大小在 Unix/Linux 中也不起作用。 我從各個論壇了解到的是: 1.您可以嘗試使用 SXSSF API,通常工作得更快。 2. 如果沒有,那么使用 setColumnWidth 方法(我知道它的字面意思是 20 列的手動工作)

我的解決方案是只在 Excel 的最后一行使用 Autosize,如下所示:

if (i >= abaExcel.Itens.Count)
    sheet.AutoSizeColumn(j);

因為合並區域不能重疊而不產生損壞的文檔,所以 POI 可能會在添加合並區域之前檢查工作表上的合並區域列表以查找潛在的交叉點。 這給出了添加一個區域的 O(N) 行為,而不是預期的 O(1)。

  1. addMergedRegion - 有檢查但速度慢

  2. addMergedRegionUnsafe - 無需檢查但速度很快

文檔: 閱讀有關 addMergedRegionUnsafe(...) 的更多信息

暫無
暫無

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

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