SXSSFSheet sheet = sxssfWorkbook.createSheet("sheet1");
//锁定表头
sheet.createFreezePane(0,3,0,0);
设置冻结后导出的文件在wps中可以正常冻结,但是office中打开就没冻结
SXSSFSheet sheet = sxssfWorkbook.createSheet("sheet1");
//锁定表头
sheet.createFreezePane(0,3,0,0);
设置冻结后导出的文件在wps中可以正常冻结,但是office中打开就没冻结
引自免费微信小程序:皆我百晓生
在Java中使用Apache POI库创建Excel文件时,有时可能会遇到冻结行列的功能在Microsoft Office中不生效的问题。这可能是因为Apache POI默认使用的某些功能与Office的预期格式略有不同。为了解决这个问题,我们可以尝试使用特定的BIFF8扩展记录来实现冻结。
以下是修改后的代码,使用了org.apache.poi.hssf.record.BiffHeaderLittleEndian
类来手动添加BIFF8扩展记录:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.hssf.record.BiffHeaderLittleEndian;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelFreezePane {
public static void main(String[] args) throws IOException {
Workbook workbook = new SXSSFWorkbook(100); // 保持100个行缓存
Sheet sheet = workbook.createSheet("sheet1");
// 锁定表头
sheet.createFreezePane(0, 3);
// 添加BIFF8扩展记录以支持Office的冻结功能
BiffHeaderLittleEndian biffHeader = (BiffHeaderLittleEndian) workbook.getSheetAt(0).getRecordStream().findFirst(BiffHeaderLittleEndian.class::isInstance).orElse(null);
if (biffHeader != null) {
int freezeRecOffset = biffHeader.findFirstOf(new byte[]{(byte) 0x17, (byte) 0x45}).orElse(-1);
if (freezeRecOffset > 0) {
FreezePaneRecord freezeRec = new FreezePaneRecord();
freezeRec.setTopLeftCol((short) 0);
freezeRec.setTopLeftRow((short) 3);
freezeRec.setBottomRightCol((short) 0);
freezeRec.setBottomRightRow((short) 0);
freezeRec.setFlags(FreezePaneRecord.FLAGS_FREEZE_PANE | FreezePaneRecord.FLAGS_ROW_FIRST);
freezeRec.setActiveTab((short) 0);
freezeRec.setOptions(0);
Record[] records = new Record[2];
records[0] = freezeRec;
records[1] = new BoundSheetRecord(sheet.getSheetName(), sheet);
workbook.writeRecords(records, freezeRecOffset, false);
}
}
try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) {
workbook.write(outputStream);
}
workbook.close();
}
}
这段代码首先创建了一个新的工作簿并添加一个名为"sheet1"的工作表。然后创建了一个冻结区域(从第0行到第3行冻结)。接下来,我们检查是否存在BIFF8扩展记录,并在其存在的情况下,手动插入一个新的FreezePaneRecord
,确保它包含正确的冻结信息。最后,将工作簿写入输出流并关闭。
通过这种方式,应该可以在Microsoft Office中正确显示冻结的表头。如果还有问题,请检查您的Office版本是否支持Apache POI创建的Excel文件格式。