如何使用 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
文件系统和*.xlsx
的Office 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);
我正在使用 apache poi 创建一个 .xls excel 文件。我需要默认设置分页视图。但我确实看过有关 .xlsx 文件的相关问题。我没有找到任何关于使用 ApachePOI
的 HSSF 的“如何设置分页视图模式”enter image description here
*.xls
的二进制BIFF
文件系统和*.xlsx
的Office 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);