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

使用Apache POI获取新单元格的边框和填充样式

慕永年
2023-03-14

随后发布了@POI Excel合并导致“修复的记录:来自/xl/Styles.xml部分(样式)的格式”

我有两个excel文件,打开的样式和颜色良好(在microsoft office 2010)。

Iam使用上面线程中发布的代码合并这两个excel文件。

问题在于样式(我创建的样式如下):

newCellStyle = newCell.getSheet().getWorkbook().createCellStyle();
      newCellStyle.cloneStyleFrom(oldCellStyle);
      styleMap.put(stHashCode, newCellStyle);

这导致了样式问题“修复的记录:Format from/xl/styles.xml部分(样式)”

经过大量的研究,我了解到边界和填充是造成问题的原因。联合国设定这些参数已经解决了这个问题。但就像它所说的那样,边界和填充消失了。

有没有人能给出一个关于如何从一个单元格获得边框和填充样式并应用到一个新单元格的想法?

共有2个答案

康赞
2023-03-14

以下是https://issues.apache.org/bugzilla/show_bug.cgi?id=55800

因为我们在边框和填充方面遇到了麻烦

在下面添加一段代码就像魅力一样工作

newCellStyle = newCell.getSheet().getWorkbook().createCellStyle();
          newCellStyle.cloneStyleFrom(oldCellStyle);
          //          newCellStyle.getCoreXf().unsetBorderId();
          //          newCellStyle.getCoreXf().unsetFillId();
          StylesTable newStylesSource = newCell.getSheet().getWorkbook().getStylesSource();
          StylesTable oldStylesSource = oldCell.getSheet().getWorkbook().getStylesSource();
          for (XSSFCellFill fill : oldStylesSource.getFills())
          {
            XSSFCellFill fillNew = new XSSFCellFill(fill.getCTFill());
            newStylesSource.putFill(fillNew);
          }
          for (XSSFCellBorder border : oldStylesSource.getBorders())
          {
            XSSFCellBorder borderNew = new XSSFCellBorder(border.getCTBorder());
            newStylesSource.putBorder(borderNew);
          }
颛孙晗昱
2023-03-14

这似乎是Apache POI#55800中的一个bug。“corexf”对象中使用的边框ID和填充ID没有复制,导致了这个问题。

根据该错误的注释5,您可以自己手动复制fill和border属性来解决这个问题。

原因是它不会复制XSSFCellFill和XSSFCellBorder。这也给边界带来了问题。我在org.apache.poi.xssf.model.StyleStable中添加了一个方法,它将帮助创建工作簿的副本。

public void copyTo(StylesTable stylesTable){
  stylesTable.numberFormats.clear();
  stylesTable.fonts.clear();
  stylesTable.fills.clear();
  stylesTable.borders.clear();
  stylesTable.styleXfs.clear();
  stylesTable.xfs.clear();
  stylesTable.dxfs.clear();
  
  for(String str : numberFormats.values())
      stylesTable.putNumberFormat(str);
  
  for(XSSFFont font : fonts){
      XSSFFont fontNew = new XSSFFont(font.getCTFont());
      fontNew.registerTo(stylesTable);
  }
  for(XSSFCellFill fill : fills){
      XSSFCellFill fillNew = new XSSFCellFill(fill.getCTFill());
      stylesTable.putFill(fillNew);
  }
  for(XSSFCellBorder border : borders){
      XSSFCellBorder borderNew = new XSSFCellBorder(border.getCTBorder());
      stylesTable.putBorder(borderNew);
  }
  for(CTXf ctxf : styleXfs){
      CTXf ctxfNew = (CTXf)ctxf.copy();
      stylesTable.putCellStyleXf(ctxfNew);
  }
  for(CTXf ctxf : xfs){
      CTXf ctxfNew = (CTXf)ctxf.copy();
      stylesTable.putCellXf(ctxfNew);
  }
  for(CTDxf dxf : dxfs){
      CTDxf dxfNew = (CTDxf)dxf.copy();
      stylesTable.putDxf(dxfNew);
  }
}
 类似资料:
  • border(int $borderStyle): \Vtiful\Kernel\Format 示例 $config = [ 'path' => './tests' ]; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $f

  • 问题内容: 我目前正在针对Python 2.7使用openpyxl v2.2.2,我想为单元格设置颜色。我已经使用以下进口 以下是我尝试使用的代码: 但出现以下错误: 关于如何使用openpyxl设置单元格A1(或其他单元格)颜色的想法? 问题答案: 我认为问题在于您正在尝试将填充对象分配给样式。 应该工作正常。

  • 问题内容: 我已经看过这个问题并在Google上搜索了一下,但到目前为止没有任何效果。我认为现在是2010年(这些问题/答案很旧,而且还没有答案),我们有了CSS3!有什么方法可以使用CSS使div填充整个表格单元格的宽度和高度吗? 我不知道单元格的宽度和/或高度会提前多少,并且将div的宽度和高度设置为100%无效。 另外,我需要div的原因是因为我需要将某些元素绝对定位在单元格之外,并且不适用

  • 我有一个巨大的excel文件,其中包含大量列,如下所示:- 当我打印excel中的所有值时,我的代码生成的输出是:- 所以,如果我们看看上面的输出,我们可以注意到我留下空白值的单元格没有被POI库拾取。有没有一种方法可以让这些值为空?还是一种识别所呈现的值跳过空白单元格的方法? 请注意:我使用的不是usermodel(org.apache.poi.ss.usermodel),而是一个事件API来处

  • 有人能给我一个解决方案,我可以在单元格为空时读取应用到单元格的样式吗? 谢了。

  • 我正在使用Apache POI读取零件编号电子表格中的数据。我在我们的数据库中查找零件编号,如果我们有零件的计算机辅助设计图纸,我将零件编号单元格涂成绿色,如果没有,我将其涂成红色。处理完成后,将保存电子表格。我遇到的问题是那列中的每个细胞都是绿色的。我已经完成了代码,查找零件号的逻辑工作正常,确定单元格应该是什么颜色以及设置颜色和填充的逻辑似乎也工作正常。知道我做错了什么吗? 谢谢