gpt4 book ai didi

java - 有什么方法可以知道 CellStyle 已经存在于工作簿中(重用)使用 POI 或仅复制 Celstyle obj 而不是引用

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:14 28 4
gpt4 key购买 nike

我想将一些记录写入 excel 但我知道 XSSFWorkbook 中的最大单元格样式是 64000。但记录超过 64000 并且考虑我想要将新的 cellstyle 应用于每个单元格,或者我将使用现有的单元格样式进行克隆。

即使要克隆,我也需要采用默认的单元格样式 workbook.createCellStyle();但这超过了 64001 条记录,这会导致 java.lang.IllegalStateException: The maximum number of cell styles was exceeded.

So is there anyway in POI to know already particular cell style is present and make use of that or when is necessary to clone/create default cellstyle and clone.

克隆的原因是:有时列/行 cellstyleexisting referenced excel cellstyle 可能不同,所以我采用默认单元格样式并克隆 col & row & cell cellstyles 到它。

即使我尝试将默认样式添加到 map map.put("defStyle",workbook.createCellStyle();) 但这不会正确克隆,因为它会在第一次尝试时改变克隆,因为 它不会获取对象,它将复制引用 即使对象克隆在这里也是不可能的,因为 cellstyle 没有实现 cloneable 接口(interface)

最佳答案

一般来说,创建的单元格样式没有必要超过可能的单元格样式的最大数量。要根据内容格式化单元格,可以使用条件格式。还可以使用条件格式来格式化行(例如,奇数/偶数行不同)。也适用于列。

所以一般来说,并不是每个单元格或大量单元格都应该使用单元格样式来格式化。相反,应该创建较少数量的单元格样式,然后用作默认单元格样式,或者在条件格式确实不可能的情况下使用。

在我的示例中,我为所有单元格设置了默认单元格样式,为第一行设置了单行单元格样式(即使这可以使用条件格式来实现)。

要在将默认单元格样式应用到所有列后保持其正常工作,它必须应用到所有使用 apache poi 新创建的单元格。为此,我提供了一个方法 getPreferredCellStyle(Cell cell)Excel 本身会自动将列(或行)单元格样式应用于新填充的单元格。

如果仍然需要对单个单元格进行不同的格式化,那么对于这个 CellUtil应该使用。这提供了“处理样式的各种方法允许您根据需要创建 CellStyles。当您将样式更改应用于单元格时,代码将尝试查看是否已经存在满足您需要的样式。如果不存在,则它将创建一个新样式。这是为了防止创建太多样式。Excel 中可以支持的样式数量有上限。”请参阅我的示例中的注释。

import java.io.*;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import org.apache.poi.ss.util.CellUtil;

import java.util.Map;
import java.util.HashMap;

public class CarefulCreateCellStyles {

public CellStyle getPreferredCellStyle(Cell cell) {
// a method to get the preferred cell style for a cell
// this is either the already applied cell style
// or if that not present, then the row style (default cell style for this row)
// or if that not present, then the column style (default cell style for this column)
CellStyle cellStyle = cell.getCellStyle();
if (cellStyle.getIndex() == 0) cellStyle = cell.getRow().getRowStyle();
if (cellStyle == null) cellStyle = cell.getSheet().getColumnStyle(cell.getColumnIndex());
if (cellStyle == null) cellStyle = cell.getCellStyle();
return cellStyle;
}

public CarefulCreateCellStyles() throws Exception {

Workbook workbook = new XSSFWorkbook();

// at first we are creating needed fonts
Font defaultFont = workbook.createFont();
defaultFont.setFontName("Arial");
defaultFont.setFontHeightInPoints((short)14);

Font specialfont = workbook.createFont();
specialfont.setFontName("Courier New");
specialfont.setFontHeightInPoints((short)18);
specialfont.setBold(true);

// now we are creating a default cell style which will then be applied to all cells
CellStyle defaultCellStyle = workbook.createCellStyle();
defaultCellStyle.setFont(defaultFont);

// maybe sone rows need their own default cell style
CellStyle aRowCellStyle = workbook.createCellStyle();
aRowCellStyle.cloneStyleFrom(defaultCellStyle);
aRowCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
aRowCellStyle.setFillForegroundColor((short)3);


Sheet sheet = workbook.createSheet("Sheet1");

// apply default cell style as column style to all columns
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol cTCol =
((XSSFSheet)sheet).getCTWorksheet().getColsArray(0).addNewCol();
cTCol.setMin(1);
cTCol.setMax(workbook.getSpreadsheetVersion().getLastColumnIndex());
cTCol.setWidth(20 + 0.7109375);
cTCol.setStyle(defaultCellStyle.getIndex());

// creating cells
Row row = sheet.createRow(0);
row.setRowStyle(aRowCellStyle);
Cell cell = null;
for (int c = 0; c < 3; c++) {
cell = CellUtil.createCell(row, c, "Header " + (c+1));
// we get the preferred cell style for each cell we are creating
cell.setCellStyle(getPreferredCellStyle(cell));
}

System.out.println(workbook.getNumCellStyles()); // 3 = 0(default) and 2 just created

row = sheet.createRow(1);
cell = CellUtil.createCell(row, 0, "centered");
cell.setCellStyle(getPreferredCellStyle(cell));
CellUtil.setAlignment(cell, HorizontalAlignment.CENTER);

System.out.println(workbook.getNumCellStyles()); // 4 = 0 and 3 just created

cell = CellUtil.createCell(row, 1, "bordered");
cell.setCellStyle(getPreferredCellStyle(cell));
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(CellUtil.BORDER_LEFT, BorderStyle.THICK);
properties.put(CellUtil.BORDER_RIGHT, BorderStyle.THICK);
properties.put(CellUtil.BORDER_TOP, BorderStyle.THICK);
properties.put(CellUtil.BORDER_BOTTOM, BorderStyle.THICK);
CellUtil.setCellStyleProperties(cell, properties);

System.out.println(workbook.getNumCellStyles()); // 5 = 0 and 4 just created

cell = CellUtil.createCell(row, 2, "other font");
cell.setCellStyle(getPreferredCellStyle(cell));
CellUtil.setFont(cell, specialfont);

System.out.println(workbook.getNumCellStyles()); // 6 = 0 and 5 just created

// until now we have always created new cell styles. but from now on CellUtil will use
// already present cell styles if they matching the needed properties.

row = sheet.createRow(2);
cell = CellUtil.createCell(row, 0, "bordered");
cell.setCellStyle(getPreferredCellStyle(cell));
properties = new HashMap<String, Object>();
properties.put(CellUtil.BORDER_LEFT, BorderStyle.THICK);
properties.put(CellUtil.BORDER_RIGHT, BorderStyle.THICK);
properties.put(CellUtil.BORDER_TOP, BorderStyle.THICK);
properties.put(CellUtil.BORDER_BOTTOM, BorderStyle.THICK);
CellUtil.setCellStyleProperties(cell, properties);

System.out.println(workbook.getNumCellStyles()); // 6 = nothing new created

cell = CellUtil.createCell(row, 1, "other font");
cell.setCellStyle(getPreferredCellStyle(cell));
CellUtil.setFont(cell, specialfont);

System.out.println(workbook.getNumCellStyles()); // 6 = nothing new created

cell = CellUtil.createCell(row, 2, "centered");
cell.setCellStyle(getPreferredCellStyle(cell));
CellUtil.setAlignment(cell, HorizontalAlignment.CENTER);

System.out.println(workbook.getNumCellStyles()); // 6 = nothing new created

FileOutputStream out = new FileOutputStream("CarefulCreateCellStyles.xlsx");
workbook.write(out);
out.close();
workbook.close();
}

public static void main(String[] args) throws Exception {
CarefulCreateCellStyles carefulCreateCellStyles = new CarefulCreateCellStyles();
}
}

关于java - 有什么方法可以知道 CellStyle 已经存在于工作簿中(重用)使用 POI 或仅复制 Celstyle obj 而不是引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42081288/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com