青年944 2024-04-22 14:17 采纳率: 53.3%
浏览 7

java pio冻结行office中失效


SXSSFSheet sheet = sxssfWorkbook.createSheet("sheet1");
        //锁定表头
        sheet.createFreezePane(0,3,0,0);

设置冻结后导出的文件在wps中可以正常冻结,但是office中打开就没冻结

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-22 14:17
    关注

    引自免费微信小程序:皆我百晓生

    在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文件格式。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月22日

悬赏问题

  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)
  • ¥15 服务端控制goose报文控制块的发布问题
  • ¥15 学习指导与未来导向啊
  • ¥15 求多普勒频移瞬时表达式