如何使用 xssfworkbook Apache POI 为 .xls 设置分页符查看模式

How to set Page Breaks View Mode for .xls using hssfwork book ApachePOI

我正在使用 apache poi 创建一个 .xls excel 文件。我需要默认设置分页视图。但我确实看过有关 .xlsx 文件的相关问题。我没有找到任何关于使用 ApachePOI

的 HSSF 的“如何设置分页视图模式”

enter image description here

*.xls的二进制BIFF文件系统和*.xlsxOffice Open XML文件系统是两个完全不同的文件系统。你不能把它们混在一起。在 apache poi 中,HSSF 代表一个,XSSF 代表另一个。 apache poi 的高层 类 尝试为两个文件系统提供方法。这是使用 SS 中的接口完成的。但在高层之外 类 需要严格区分这两个文件系统。

高阶类目前还没有提供sheet设置分页预览。所以我们需要 underlyinf low lewel 类。对于 XSSF,这是 org.openxmlformats.schemas.spreadsheetml.x2006.main.* 类,它们是 XSSF 内部结构的 XML 表示。但是对于 HSSF,这是 org.apache.poi.hssf.record.* 类,它们是 HSSF 内部的二进制表示。

为 sheet 设置分页预览对于两个文件系统都可以这样做:

import java.io.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.hssf.usermodel.*;

import org.apache.poi.hssf.model.InternalSheet;
import org.apache.poi.hssf.record.WindowTwoRecord;

public class ExcelPageBreakPreview {
  
 public static void main(String[] args) throws Exception {
  //Workbook workbook = WorkbookFactory.create(new FileInputStream("./ExcelTemplate.xlsx")); String filePath = "./ExcelInPageBreakPreview.xlsx";
  Workbook workbook = WorkbookFactory.create(new FileInputStream("./ExcelTemplate.xls")); String filePath = "./ExcelInPageBreakPreview.xls";

  Sheet sheet = workbook.getSheetAt(0);

  //set sheet in PageBreakPreview
  if (sheet instanceof XSSFSheet) {
   XSSFSheet xssfSheet= (XSSFSheet)sheet;   
   xssfSheet.lockSelectLockedCells(true);
   xssfSheet.getCTWorksheet().getSheetViews().getSheetViewArray(0).setView(org.openxmlformats.schemas.spreadsheetml.x2006.main.STSheetViewType.PAGE_BREAK_PREVIEW);   
  } else if (sheet instanceof HSSFSheet) {
   HSSFSheet hssfSheet= (HSSFSheet)sheet; 
   InternalSheet internalSheet = hssfSheet.getSheet(); 
   WindowTwoRecord record = internalSheet.getWindowTwo();
   record.setSavedInPageBreakPreview(true);
  }

  FileOutputStream fileOut = new FileOutputStream(filePath);
  workbook.write(fileOut);
  fileOut.close();
  workbook.close();
 }
}

以前的 apache poi 版本可能没有 InternalSheet HSSFSheet.getSheet public。然后需要使用反射来获取 InternalSheet:

   //InternalSheet internalSheet = hssfSheet.getSheet(); 
   java.lang.reflect.Field _sheet = HSSFSheet.class.getDeclaredField("_sheet");
   _sheet.setAccessible(true); 
   InternalSheet internalSheet = (InternalSheet)_sheet.get(hssfSheet);