使用Apache POI插入内容
介紹
大家都知道POI! 它是可用Java創(chuàng)建Excel文檔的最佳庫。 它真的很好,可以輕松地完成很多事情。 但是最近我想做些不那么簡單的事情。 我想將現(xiàn)有的xlsx文件用作模板,并在某些位置將一些數(shù)據(jù)插入其中。 在這篇文章中,我將說明為什么版本4.0.0并不那么容易。
可用工具
為了在現(xiàn)有Excel文檔的中間插入一些內(nèi)容,必須將從插入點到最后一行的所有行向下移動n行,其中n是要插入的行數(shù)。 還最好保持要移動的行的格式。
實際上,POI具有一些API可以幫助解決這些問題。 的
工作表界面有方法
Sheet.shiftRows(int,int,int)可以這樣使用:
sheet.shiftRows(insertPosition,sheet.getLastRowNum(),n);
有更高級的方法
Sheet.shiftRows(int,int,int,boolean,boolean),但是對于XSSF,布爾參數(shù)沒有什么區(qū)別,正如我在代碼中可以找到的那樣。 對于HSSF,這些參數(shù)可能很重要。
因此,該方法應(yīng)該可以解決問題! 有什么問題?
問題
當我嘗試使用這種方法時,遇到了一個可怕的問題:“我們發(fā)現(xiàn)了一些內(nèi)容問題……”
實際上,這非常令人沮喪。 我很快發(fā)現(xiàn)行以某種方式被錯誤地移動了。 LibreOffice至少能夠打開文件,但是格式和插入的內(nèi)容均錯誤。
解
這需要2-3個小時的勤奮挖掘:-)。 事實證明,即使在最新的4.0.0版本(甚至很可能是4.0.1版本)中,POI也存在錯誤,無法正確移動行。 這是該錯誤的鏈接:
https://bz.apache.org/bugzilla/show_bug.cgi?id=57423
例如,該方法更新工作表xml中的行引用
<row r =” 139 “
但不會更新單元格引用
<cr =” A138 ” s =“ 1” /> –錯誤
在這種情況下,單元必須指向上一級行,如下所示:
<cr =” A139 ” s =“ 1” /> –對
(如果您解壓縮xlsx文件,則可以查看工作表xml)
該錯誤顯示了一種解決方法。 我創(chuàng)建了一個方法,該方法在一個方法中實現(xiàn)了移位和變通方法:
public static void xssfShiftRows(Sheet sh, int firstRow, int last Row, int shiftN) {int firstShiftedRow = firstRow + shiftN;int lastShiftedRow = lastRow + shiftN;sh.shiftRows(firstRow, lastRow, shiftN, true, true);/** This code is a workaround for the bug* https://bz.apache.org/bugzilla/show_bug.cgi?id=57423* In the sheet xml the row references are updated like this:* <row r="139"* but the cell references are incorrect* <c r="A138" s="1"/>** The number in the row 139 must match the number in the cell A139.* This code manually updates these links.*/for (int nRow = firstShiftedRow; nRow <= lastShiftedRow; nRow++) {final Row row = sh.getRow(nRow);if (row != null) {String msg = "Row[rownum=" + row.getRowNum()+ "] contains cell(s) included in a multi-cell array formula. "+ "You cannot change part of an array.";for (Cell c : row) {((XSSFCell) c).updateCellReferencesForShifting(msg);}} } }翻譯自: https://www.javacodegeeks.com/2019/03/insert-content-apache-poi.html
總結(jié)
以上是生活随笔為你收集整理的使用Apache POI插入内容的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑系统内存有哪些(电脑内存都有哪些)
- 下一篇: 现在什么行业发展前景最好(目前最有前景的