日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Apache POI插入内容

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Apache POI插入内容 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

大家都知道POI! 它是可用Java創建Excel文檔的最佳庫。 它真的很好,可以輕松地完成很多事情。 但是最近我想做些不那么簡單的事情。 我想將現有的xlsx文件用作模板,并在某些位置將一些數據插入其中。 在這篇文章中,我將說明為什么版本4.0.0并不那么容易。

可用工具

為了在現有Excel文檔的中間插入一些內容,必須將從插入點到最后一行的所有行向下移動n行,其中n是要插入的行數。 還最好保持要移動的行的格式。

實際上,POI具有一些API可以幫助解決這些問題。 的
工作表界面有方法
Sheet.shiftRows(int,int,int)可以這樣使用:

sheet.shiftRows(insertPosition,sheet.getLastRowNum(),n);

有更高級的方法
Sheet.shiftRows(int,int,int,boolean,boolean),但是對于XSSF,布爾參數沒有什么區別,正如我在代碼中可以找到的那樣。 對于HSSF,這些參數可能很重要。

因此,該方法應該可以解決問題! 有什么問題?

問題

當我嘗試使用這種方法時,遇到了一個可怕的問題:“我們發現了一些內容問題……”

實際上,這非常令人沮喪。 我很快發現行以某種方式被錯誤地移動了。 LibreOffice至少能夠打開文件,但是格式和插入的內容均錯誤。

這需要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)

該錯誤顯示了一種解決方法。 我創建了一個方法,該方法在一個方法中實現了移位和變通方法:

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

總結

以上是生活随笔為你收集整理的使用Apache POI插入内容的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。