【问题标题】:How to set Page Breaks View Mode for .xls using hssfwork book ApachePOI如何使用 xssfworkbook Apache POI 为 .xls 设置分页符视图模式
【发布时间】:2021-12-16 03:25:08
【问题描述】:

我正在使用 apache poi 创建一个 .xls excel 文件。我需要默认设置分页符视图。但我确实在 .xlsx 文件上查看了一个相关问题。我没有找到任何“如何设置分页符视图模式”来使用 ApachePOI 的 HSSF

enter image description here

【问题讨论】:

标签: java apache-poi


【解决方案1】:

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

到目前为止,高级课程还没有为工作表设置分页预览。所以我们需要underlyinf low lewel 类。对于XSSF,这是org.openxmlformats.schemas.spreadsheetml.x2006.main.* 类,它们是XSSF 内部的XML 表示。但是对于HSSF,这是org.apache.poi.hssf.record.* 类,它们是HSSF 内部的二进制表示。

对于两个文件系统都可以像这样为工作表设置分页预览:

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 公开。然后需要使用反射来获取InternalSheet

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

【讨论】:

  • 谢谢,我试试
  • 当我检查 HSSFSheet.class 然后方法 getSheet() 被锁定在包中。我正在使用 Apache POI 3.17 版。有没有其他办法?
  • @Huy Nguyễn Ngọc:我的示例总是使用当前的apache poi 版本。根本不使用古代版本。 apache poi 不再支持它们。在apache poi 3.17 中,需要使用反射来获得InternalSheet。在答案中查看我的补充。
  • 谢谢,它对我有用
猜你喜欢
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
相关资源
最近更新 更多