Apache POI 设置单元格边框不起作用

来自 D LE

我正面临 Apache POI (v 4.1.2) 无法将边框设置为 THIN 的问题。XLS 和 XLSX 扩展都支持我的代码。当我将数据导出到 XLSX 文件时,一切正常,但是对于 XLS 文件,它不会绘制从单元格K5到末尾的边界

问题图片

这是我的代码:

private int populateExcelData(Workbook workbook, Sheet sheet, int rowNum, List<List<Object>> excelData,
            ExcelVo excelVo, Boolean isHeader) {
        if (CollectionUtils.isNotEmpty(excelData)) {
            int cellNum = 0;
            Row row;
            for (List<Object> objects : excelData) {
                cellNum = excelVo.getColPadding();
                row = sheet.createRow(rowNum++);
                Cell cell;
                for (Object object : objects) {
                    cell = row.createCell(cellNum++);
                    setCellValue(cell, object, excelVo);
                    configCellStyle(cell, workbook, excelVo, isHeader);
                }
            }
        }
        return rowNum;
    }

private void configCellStyle(Cell cell, Workbook workbook, ExcelVo excelVo, Boolean isHeader) {
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
        cellStyle.setBorderTop(BorderStyle.THIN);
        if (isHeader) {
            Font headerFont = workbook.createFont();
            headerFont.setBold(true);
            headerFont.setColor(excelVo.getFontColor().getIndex());
            cellStyle.setFont(headerFont);
            cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            cellStyle.setFillForegroundColor(excelVo.getBackgroundColor().getIndex());
        }
        cell.setCellStyle(cellStyle);
    }

我不知道为什么使用 XLS 文件它只从单元格K5开始绘制边界代码不会抛出错误或异常。

感谢大家的支持。

阿克塞尔·里希特

Excel 对独特的单元格格式/单元格样式以及字体都有限制单元格样式和字体存储在工作簿级别。它们为所有工作表中的所有单元格共享。当前 Excel 版本限制为:

独特的单元格格式/单元格样式:65,490

独特的字体类型:1,024 种全局字体可供使用;每个工作簿 512 个

以前版本的 Excel(二进制 *.xls)的限制甚至更小。

因此,如果您为每个单元格创建单独的单元格样式,正如您所做的那样,您将很快达到极限。XSSF可能会在限制较大时起作用。但是以前版本的 Excel(二进制 *.xls)的限制甚至更小。这就是为什么它不使用HSSF.

那么什么做的是,根据需要为工作簿创建尽可能多的单元格样式,一旦在工作簿水平。在单元格填充过程之外执行此操作在创建单元格本身时,单元格样式只能使用cell.setCellStyle. 但它无法在那时被创建。

让我们用一个完整的例子来说明这一点。它部分使用了您的代码,populateExcelData但我只能希望它符合您的想法,因为您没有提供完整的示例。

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.util.GregorianCalendar;
import java.util.List;
import java.util.ArrayList;

import org.apache.commons.collections4.CollectionUtils;

public class CreateExcel {

 private Workbook workbook;
 private CellStyle textStyle;
 private CellStyle dateStyle;
 private CellStyle numberStyle;
 private CellStyle headerStyle;

 public CreateExcel(String type, String path, List<List<Object>> headerData, List<List<Object>> excelData) {
  try {
   this.workbook = ("HSSF".equals(type)) ? new HSSFWorkbook() : new XSSFWorkbook(); 

   DataFormat dataFormat = workbook.createDataFormat();

   this.textStyle = workbook.createCellStyle();
   setCellStyleAllBorders(textStyle);

   this.dateStyle = workbook.createCellStyle();
   dateStyle.setDataFormat(dataFormat.getFormat("DDDD, MMMM, DD, YYYY"));
   setCellStyleAllBorders(dateStyle);

   this.numberStyle = workbook.createCellStyle();
   numberStyle.setDataFormat(dataFormat.getFormat("#,##0.00 \" Coins\""));
   setCellStyleAllBorders(numberStyle);

   this.headerStyle = workbook.createCellStyle();
   Font headerFont = workbook.createFont();
   headerFont.setBold(true);
   headerFont.setColor(IndexedColors.WHITE.getIndex());
   headerStyle.setFont(headerFont);
   headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
   headerStyle.setFillForegroundColor(IndexedColors.BLACK.getIndex());
   setCellStyleAllBorders(headerStyle);

   Sheet sheet = workbook.createSheet(); 

   int rowNum = 0;
   rowNum = populateExcelData(workbook, sheet, rowNum, headerData, 1, true);

   rowNum = populateExcelData(workbook, sheet, rowNum, excelData, 1, false);
   
   System.out.println(rowNum);

   for (int c = 0; c < 256; c++) {
    sheet.autoSizeColumn(c); // this is very time consuming, would be better one can set column widths using Sheet.setColumnWidth(int columnIndex, int width) directly
   }

   FileOutputStream fileout = new FileOutputStream(path);
   this.workbook.write(fileout);
   fileout.close();
   this.workbook.close();

  } catch (Exception ex) {
   ex.printStackTrace(); 
  }
 }

 private int populateExcelData(Workbook workbook, Sheet sheet, int rowNum, List<List<Object>> excelData, Integer colPadding, Boolean isHeader) {
  if (CollectionUtils.isNotEmpty(excelData)) {
   int cellNum = 0;
   Row row;
   for (List<Object> objects : excelData) {
    cellNum = colPadding;
    row = sheet.createRow(rowNum++);
    Cell cell;
    for (Object object : objects) {
     cell = row.createCell(cellNum++);
     setCellValueAndStyle(cell, object, isHeader);
    }
   }
  }
  return rowNum;
 }

 private void setCellValueAndStyle(Cell cell, Object object, Boolean isHeader) {
  if (object instanceof String) {
   cell.setCellValue((String) object);
   if (!isHeader) cell.setCellStyle(this.textStyle);
  } else if (object instanceof Double) {
   cell.setCellValue((Double) object);
   if (!isHeader) cell.setCellStyle(this.numberStyle);
  } else if (object instanceof GregorianCalendar) {
   cell.setCellValue((GregorianCalendar) object);
   if (!isHeader) cell.setCellStyle(this.dateStyle);
  }
  if (isHeader) cell.setCellStyle(this.headerStyle);
 }

 private void setCellStyleAllBorders(CellStyle cellStyle) {
  cellStyle.setBorderBottom(BorderStyle.THIN);
  cellStyle.setBorderLeft(BorderStyle.THIN);
  cellStyle.setBorderRight(BorderStyle.THIN);
  cellStyle.setBorderTop(BorderStyle.THIN);
 }

 public static void main(String[] args) throws Exception {
  List<List<Object>> headerData = new ArrayList<>();
  List<Object> headerRow = new ArrayList<>();
  headerRow.add("Text"); headerRow.add("Value"); headerRow.add("Date");
  headerData.add(headerRow);
  headerRow = new ArrayList<>();
  headerRow.add("not formatted"); headerRow.add("in Coins"); headerRow.add("as long date");
  headerData.add(headerRow);

  List<List<Object>> excelData = new ArrayList<>();
  for (int r = 1; r < 1000; r++) {
   List<Object> excelRow = new ArrayList<>();
   excelRow.add("Text" + r); excelRow.add(123.45 * r); excelRow.add(new GregorianCalendar(2020, 0, r));
   excelData.add(excelRow);
  }

  CreateExcel test = new CreateExcel("HSSF", "./Excel.xls", headerData, excelData);
  test = new CreateExcel("XSSF", "./Excel.xlsx", headerData, excelData);
 }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Apache-POI:单元格背景色不起作用

Java Apache POI空白单元格

Apache POI的ProGuard设置

Apache POI:无法更改单元格值

使用Apache POI在Excel中合并单元格

使用Apache POI获取单元格颜色

如何使用Apache POI缓存公式单元格

使用Apache POI在Excel单元格中写入数字

在Apache POI中按文本查找Excel单元格

Apache POI无法替换空白Excel单元格

颜色和正确对齐的Apache poi单元格样式

Java Apache POI:Excel单元格颜色

Apache POI无法正确格式化单元格

Apache poi,加载时缺少单元格

使用Apache POI从Excel读取单元格

如何在apache poi表的不同行中设置特定的单元格宽度?

如何使用Apache POI 4.1.0为不同的单元格设置不同的背景颜色

如何使用 apache poi 4.1.0 设置单元格的背景颜色

如何使用Apache POI同时合并单元格和设置值?

APACHE POI 4.1:从十六进制代码设置单元格背景颜色

如何通过Apache POI在Excel中设置单元格的样式?

Java / Apache POI-如何更改/设置特定单元格中的字体大小?

Apache POI - 条件格式 - 需要为规则和格式设置不同的单元格范围

Apache POI背景颜色样式似乎不起作用

使用Apache POI在Excel中将公式单元格转换为错误单元格

Apache POI 在 xlsx 文件的单元格中设置值,但未在处理条中确认它们

Apache-POI:创建电子表格时如何设置单元格的背景色?

使用apache poi将单元格内容的一部分设置为粗体?

如何在Apache POI XSSF 4.10中将单元格类型设置为字符串?