当前位置: 首页 > 知识库问答 >
问题:

Apache POI:为包含不同样式的列设置边框的优雅方法

张坚白
2023-03-14

我正在使用Apache-POI动态创建一个新的xlsx文件。任何列都可以包含不同的值类型(数字、字符串、布尔值、...)。在将数据插入poi文档时,我根据数据类型设置CellStyles:

public final XSSFCellStyle cellStyleString;
public final XSSFCellStyle cellStyleNumber;
public final XSSFCellStyle cellStyleDate;
public final XSSFCellStyle cellStyleHeader;

标题行的外观如下:

|   |   |   | Shared Header |
| H1| H2| H3|SH1|SH2|SH3|SH4|

有“简单”标头和包含“子标头”的“共享标头”。共享标头驻留在合并的单元格中。

不,我希望在列SH1处有一个左边框,在列SH4处有一个右边框,以强调分组。但是,由于任何列都可能包含所有cellstyles的混合体,因此我似乎必须创建如下的cellstyles

public final XSSFCellStyle cellStyleString;
public final XSSFCellStyle cellStyleStringBorderLeft;
public final XSSFCellStyle cellStyleStringBorderRight;
//and so on for the other styles...
public final XSSFCellStyle cellStyleString;
public final XSSFCellStyle cellStyleStringBorderLeftThickLine;
public final XSSFCellStyle cellStyleStringBorderRightThickLine;
public final XSSFCellStyle cellStyleStringBorderLeftThinLine;
public final XSSFCellStyle cellStyleStringBorderRightThinLine;
//and so on for the other styles...

虽然我更喜欢一种干净简单的方法,以最大限度地减少创建的样式的数量,但我无意中发现了HSSFOptimiser,它可以删除重复的CellStyles。我不知道那门课。尽管我更喜欢避免使用这个实用程序,但它符合这个问题,值得在此提及。

共有1个答案

白弘伟
2023-03-14

我即将完成对POI的一个增强,它将允许您用它们的特定样式填充值,然后在它们周围绘制边框,而不必手动创建所有必要的样式。同时,有一种方法可以使用cellitil.setCellStyleProperties()来实现。这允许您将一组属性添加到单元格已存在的CellStyle中。

参见HSSF/XSSF的POI快速指南:

Workbook workbook = new XSSFWorkbook();  // OR new HSSFWorkbook()
Sheet sheet = workbook.createSheet("Sheet1");
Map<String, Object> properties = new HashMap<String, Object>();

// create your spreadsheet without borders
...

// create property set for vertical borders
properties.put(CellUtil.BORDER_LEFT, CellStyle.BORDER_MEDIUM);
properties.put(CellUtil.BORDER_RIGHT, CellStyle.BORDER_MEDIUM);

// Apply the borders to a 3x3 region starting at D4
for (int ix=3; ix <= 5; ix++) {
  row = sheet.createRow(ix);
  for (int iy = 3; iy <= 5; iy++) {
    cell = row.createCell(iy);
    CellUtil.setCellStyleProperties(cell, properties);
  }
}

这允许您基本上填写您的电子表格,然后绘制边框一次一个单元格。注意,如果你所有的边框都是相似的(所有的薄),那么这将适用于你的整个范围。但是,如果希望在表的外部绘制中等边框,则必须创建一些附加的属性集。注意,对于已经在电子表格中的行和单元格,不必使用createRow()createCell()。这将适用于合并单元格。

注意:cellitil.setCellStyleProperties()出现在POI3.14中,允许您在一个镜头中添加多个单元格属性,从而避免创建多个未使用的样式。旧的Cellitil.SetCellStyleProperty()一次设置一个属性,并在电子表格中创建中间的CellStyle对象,结果从未使用过。在较大的纸张中,这可能是一个问题。

编辑:PropertyTemplate是POI3.15中添加的一个新对象,它允许您为单元格定义一组边框,并将其标记到任何要应用它的工作表上。这个对象就像创建一个预打印的表单来覆盖数据。有关如何使用PropertyTemplate的详细信息,请参阅POI电子表格快速指南。

 类似资料:
  • 我正在用css设计一个下拉列表,这里是我的html代码: 我已经将每个属性border-right设置为;我想删除上一个元素属性 下面是css代码: 我想删除最后一个列表的右边框,所以我尝试使用类。但不能给出任何解决办法,请有谁能让我知道,谢谢提前

  • 问题内容: 如何在Firefox中设置复选框样式,并取消选中标记和边框? CSS: HTML: 问题答案: input[type=”checkbox”] {

  • 我刚刚回到学习引导,html和css。到目前为止,我有三张不同宽度的卡片,使用自举网格水平卡片模板。我的问题是,我希望我的布局是相同的每张卡片,标题和段落应该是相同的距离在每个和fav/info按钮从标题相同的距离。此外,我设法让前两列接近,但不知何故,最后一列和最大一列的图像和标题之间有奇怪的超大行间距。我该怎么做呢? 我试图手动调整每张卡中元素的位置,但很难让它们保持一致,这也让我的代码变得一

  • 本文向大家介绍为不同大小的设备设置不同CSS样式规则的媒体查询,包括了为不同大小的设备设置不同CSS样式规则的媒体查询的使用技巧和注意事项,需要的朋友参考一下 要为不同的CSS样式规则设置媒体查询,您可以尝试运行以下代码- 示例

  • 我在我的供应链模型中有两种类型的边缘:demand_links和supply_links。所有链接的默认颜色是灰色。但是我想在每次更改demand_link的属性时将demand_links的颜色更改为红色(注意:边缘是通过边缘创建者自定义边缘代理)。如何做到这一点? 下面是我的简单测试代码,但它不起作用。 初始化时我收到错误。