本文将继续介绍POI的使用,上接在Java中使用Apache POI导入导出Excel(二)
使用Apache POI组件操作Excel(三)
24、拆分和冻结窗格
您可以创建两种类型的窗格;冻结窗格和拆分窗格。
冻结窗格按列和行进行拆分。您创建 使用以下机制的冻结窗格:
sheet1.createFreezePane( 3, 2, 3, 2 );
前两个参数是列和行 希望分裂。后两个参数表示 在右下象限中可见的单元格。
拆分窗格的显示方式不同。分割区域为 分为四个独立的工作区域。分裂 发生在像素级别,并且用户能够 通过将分割拖动到新位置来调整分割。
拆分窗格是使用以下调用创建的:
sheet2.createSplitPane( 2000, 2000, 0, 0, Sheet.PANE_LOWER_LEFT );
第一个参数是分割的 x 位置。 这是 1/20 点。本案中的一点 似乎等同于一个像素。第二个参数是 拆分的 y 位置。再次在 1/20 分。
最后一个参数指示当前具有的窗格 焦点。这将是 Sheet.PANE_LOWER_LEFT 之一, PANE_LOWER_RIGHT、PANE_UPPER_RIGHT 或 PANE_UPPER_LEFT。
java">Workbook wb = new XSSFWorkbook();Sheet sheet1 = wb.createSheet("new sheet");
Sheet sheet2 = wb.createSheet("second sheet");
Sheet sheet3 = wb.createSheet("third sheet");
Sheet sheet4 = wb.createSheet("fourth sheet");// Freeze just one row
sheet1.createFreezePane( 0, 1, 0, 1 );// Freeze just one column
sheet2.createFreezePane( 1, 0, 1, 0 );// Freeze the columns and rows (forget about scrolling position of the lower right quadrant).
sheet3.createFreezePane( 2, 2 );// Create a split with the lower left side being the active quadrant
sheet4.createSplitPane( 2000, 2000, 0, 0, Sheet.PANE_LOWER_LEFT );try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {wb.write(fileOut);
}
25、重复行和列
可以在 使用 setRepeatingRows() 和 setRepeatingColumns() 方法。这些方法需要 CellRangeAddress 参数 ,它指定行或列的范围 重复。 对于 setRepeatingRows(),它应该指定一个范围 rows 以重复,其中 column 部分跨越所有 列。 对于 setRepeatingColumns(),它应该指定一个范围 列以重复,其中行部分跨越所有 行。 如果参数为 null,则重复的行或列 将被删除。
java">Workbook wb = new XSSFWorkbook();Sheet sheet1 = wb.createSheet("Sheet1");
Sheet sheet2 = wb.createSheet("Sheet2");// Set the rows to repeat from row 4 to 5 on the first sheet.
sheet1.setRepeatingRows(CellRangeAddress.valueOf("4:5"));// Set the columns to repeat from column A to C on the second sheet
sheet2.setRepeatingColumns(CellRangeAddress.valueOf("A:C"));try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {wb.write(fileOut);
}
26、页眉和页脚
示例适用于页眉,但直接应用于页脚。
java">Workbook wb = new XSSFWorkbook();Sheet sheet = wb.createSheet("new sheet");Header header = sheet.getHeader();
header.setCenter("Center Header");
header.setLeft("Left Header");
header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {wb.write(fileOut);
}
27、页眉和页脚的 XSSF 增强功能
示例适用于页眉,但直接应用于页脚。请注意,上面的 基本页眉和页脚适用于 XSSF 工作簿以及 HSSF 工作簿。HSSFHeader 公司 stuff 不适用于 XSSF 工作簿。
XSSF 能够处理首页页眉和页脚,以及偶数/奇数 页眉和页脚。所有页眉/页脚属性标志也可以在 XSSF 中处理。 奇数页眉和页脚是默认的页眉和页脚。它显示在所有 不显示首页页眉或不显示偶数页页眉的页面。那是 如果偶数页眉/页脚不存在,则奇数页眉/页脚显示在 甚至页面。如果第一页页眉/页脚不存在,则奇数页眉/页脚 显示在第一页上。如果未设置 even/odd 属性,则与 偶数页眉/页脚不存在。如果 first page 属性不存在,则为 与第一页页眉/页脚不存在相同。
java">Workbook wb = new XSSFWorkbook();XSSFSheet sheet = (XSSFSheet) wb.createSheet("new sheet");// Create a first page header
Header header = sheet.getFirstHeader();
header.setCenter("Center First Page Header");
header.setLeft("Left First Page Header");
header.setRight("Right First Page Header");// Create an even page header
Header header2 = sheet.getEvenHeader();
der2.setCenter("Center Even Page Header");
header2.setLeft("Left Even Page Header");
header2.setRight("Right Even Page Header");// Create an odd page header
Header header3 = sheet.getOddHeader();
der3.setCenter("Center Odd Page Header");
header3.setLeft("Left Odd Page Header");
header3.setRight("Right Odd Page Header");// Set/Remove Header properties
XSSFHeaderProperties prop = sheet.getHeaderFooterProperties();
prop.setAlignWithMargins();
prop.scaleWithDoc();
prop.removeDifferentFirstPage(); // This does not remove first page headers or footers
prop.removeDifferentEvenOdd(); // This does not remove even headers or footerstry (OutputStream fileOut = new FileOutputStream("workbook.xlsx")) {wb.write(fileOut);
}
28、绘制形状
POI 支持使用 Microsoft Office 绘制形状 绘图工具。图纸上的形状以 组和 AND 形状的层次结构。最顶层的形状 是族长。这在工作表上不可见 完全。要开始绘制,您需要在 XSSFSheet 类上调用 createPatriarch。这具有 效果擦除存储的任何其他形状信息 在那张纸上。默认情况下,POI 将保留形状 记录在工作表中,除非您调用 此方法。
要创建形状,您必须完成以下操作 步骤:
- 创建 Patriarch。
- 创建锚点以将形状定位在图纸上。
- 请族长创建形状。
- 设置形状类型(线条、椭圆、矩形等)
- 设置有关形状的任何其他样式详细信息。(例如: 线条粗细等)
java">XSSFPatriarch patriarch = sheet.createDrawingPatriarch();
a = new XSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );XSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);
shape1.setShapeType(XSSFSimpleShape.OBJECT_TYPE_LINE);
文本框是使用其他调用创建的:
java">XSSFTextbox textbox1 = patriarch.createTextbox(new XSSFClientAnchor(0,0,0,0,(short)1,1,(short)2,2));
textbox1.setString(new XSSFRichTextString("This is a test") );
可以使用不同的字体来设置 TextBox 中的文本。方法如下:
java">XSSFFont font = wb.createFont();
font.setItalic(true);
font.setUnderline(XSSFFont.U_DOUBLE);
XSSFRichTextString string = new XSSFRichTextString("Woo!!!");
string.applyFont(2,5,font);
textbox.setString(string );
就像使用 Excel 手动完成一样,将形状组合在一起这是可能的。这是通过使用这些组调用 createGroup()创建形状。也可以在组内创建组。
警告:您创建的任何组都应至少包含两个 其他形状或子组。
以下是创建形状组的方法:
java">// Create a shape group.
XSSFShapeGroup group = patriarch.createGroup(new XSSFClientAnchor(0,0,900,200,(short)2,2,(short)2,2));// Create a couple of lines in the group.
XSSFSimpleShape shape1 = group.createShape(new XSSFChildAnchor(3,3,500,500));shape1.setShapeType(XSSFSimpleShape.OBJECT_TYPE_LINE);((XSSFChildAnchor) shape1.getAnchor()).setAnchor(3,3,500,500);XSSFSimpleShape shape2 = group.createShape(new XSSFChildAnchor(1,200,400,600));
shape2.setShapeType(XSSFSimpleShape.OBJECT_TYPE_LINE);
如果你仔细观察,你会注意到形状 添加到组中的锚点使用新类型的锚点: XSSFChildAnchor 的 Anchor 中。发生的事情是 创建的组具有自己的坐标空间 放置在其中的形状。POI 默认将其设置为 (0,0,1023,255),但您可以根据需要更改它。 方法如下:
java">myGroup.setCoordinates(10,10,20,20); // top-left, bottom-right
如果您在一个组中创建一个组,它也会 拥有自己的坐标空间。
29、样式化形状
默认情况下,形状看起来有点普通。可对形状应用不同的样式。目前可以做的事情包括:
- 更改填充颜色。
- 创建没有填充颜色的形状。
- 更改线条的粗细。
- 更改线条的样式。例如:虚线、点。
- 更改线条颜色。
以下是如何执行此操作的示例:
java">XSSFSimpleShape s = patriarch.createSimpleShape(a);s.setShapeType(XSSFSimpleShape.OBJECT_TYPE_OVAL);
s.setLineStyleColor(10,10,10);
s.setFillColor(90,10,200);
s.setLineWidth(XSSFShape.LINEWIDTH_ONE_PT * 3);
s.setLineStyle(XSSFShape.LINESTYLE_DOTSYS);
30、形状和图形2D
虽然原生 POI 形状绘制命令是 在形状中绘制形状的推荐方法有时 最好使用标准 API 以兼容 外部库。考虑到这一点,我们创建了一些 Graphics 和 Graphics2d 的包装器。
所有图形命令都发送到 XSSFShapeGroup 中。 这是如何完成的:
java">a = new XSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );group = patriarch.createGroup( a );
group.setCoordinates( 0, 0, 80 * 4 , 12 * 23 );float verticalPointsPerPixel = a.getAnchorHeightInPoints(sheet) / (float)Math.abs(group.getY2() - group.getY1());g = new EscherGraphics( group, wb, Color.black, verticalPointsPerPixel );g2d = new EscherGraphics2d( g );drawChemicalStructure( g2d );
我们做的第一件事是创建组并设置其坐标 以匹配我们计划绘制的内容。接下来我们计算一个合理的 fontSizeMultiplier 创建 EscherGraphics 对象。 由于我们真正需要的是 Graphics2d 对象,因此我们创建一个 EscherGraphics2d 对象并传入 我们创建的 Graphics 对象。最后,我们调用 routine ,该对象将绘制到 EscherGraphics2d 对象中。
每个像素的垂直点值得更多解释。 转换 Graphics 调用的难点之一 进入 Escher 绘图调用是 Excel 没有 绝对像素位置的概念。它衡量 它的单元格宽度(以 'characters' 为单位)和单元格高度(以磅为单位)。 不幸的是,它没有明确定义它是什么类型的角色 测量。据推测,这是因为 Excel 将是 在不同平台上甚至在同一平台内使用不同的字体 平台。
由于这个约束,我们不得不实现 verticalPointsPerPixel 的 Pixel。这是字体在以下时间应缩放的量 您发出 drawString() 等命令。计算此值 使用以下公式:
java">multipler = groupHeightInPoints / heightOfGroup
组的高度计算相当简单,方法是计算 形状的边界框的 y 坐标之间的差异。这 可以使用名为 HSSFClientAnchor.getAnchorHeightInPoints() 的便利性来计算组的高度。
graphics 类支持的许多函数 不完整。以下是一些已知的函数 工作。
- fillRect()
- fillOval()
- drawString()
- drawOval()
- drawLine()
- clearRect()
不支持的函数将返回并记录一条消息 使用 POI 日志记录基础设施(默认处于禁用状态)。