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

POI/NPOI中的工作簿单元格样式不能与工作簿中的多个样式一起正常工作

柯河
2023-03-14

我遇到了奇怪的问题与.NET版本的POI库为Excel电子表格。我正在重写从文本文件到Excel97-2003文档,我想添加一些格式,以编程方式,依赖于一些在程序的乞求下收集的值。

一开始,在我根据给定值创建一个新单元格的方法中,我也创建了一个新的工作簿CellStyle,这是错误的,因为我很快就用完了这些样式(或者我只是认为这是问题的原因)。

负责Excel工作簿的类的构造函数:

public OldExcelWriter(TextWriter logger) : base(logger)
{
    _workbook = new HSSFWorkbook();
    _sheetData = _workbook.CreateSheet("sheet1");
    _creationHelper = _workbook.GetCreationHelper();
}
public void Write(string path, Data data)
{
    FillSpreadSheetWithData(data, _sheetData);
    SaveSpreadSheet(_workbook, path);
}

长话短说,在FillSpreadSheetWithData中,我有一个创建行的方法,其中每个单元格都有一个循环,所以基本上我要遍历每一列,传递行、列值、索引和格式信息的IRow引用,如下所示:

for (int j = 0; j < column.Count; j++)
{
    CreateCell(row, column[j], j, data.Formatting[j]);
}

在创建新样式时(第一次拍摄时,我试图传递一些日期时间值),我在重新编写的excel中遇到了这样的情况:excel工作簿的屏幕截图

所以格式化是正确通过的(水平对齐等),但它变得难看后第15行(总是相同的数量)。

DateTime dataCell = DateTime.MaxValue;
var cell = row.CreateCell(columnIndex);

 _cellStyle = _workbook.CreateCellStyle();

            switch (format.Type)
            {
                case DataType.Date:
                    _cellStyle.DataFormat = _creationHelper.CreateDataFormat().GetFormat("m/dd/yyyy");
                    if (value.Replace("\n", "") != string.Empty)
                    {
                        dataCell = DateTime.ParseExact(value.Replace("\n", ""), "m/dd/yyyy",
                            System.Globalization.CultureInfo.InvariantCulture);
                    }
                    break;
            }

            switch (format.HorizontalAlignment)
            {
                case Enums.HorizontalAlignment.Left:
                    _cellStyle.Alignment = HorizontalAlignment.LEFT;
                    break;
                case Enums.HorizontalAlignment.Center:
                    _cellStyle.Alignment = HorizontalAlignment.CENTER;
                    break;
            }

            if (dataCell != DateTime.MaxValue)
            {
                cell.CellStyle = _cellStyle;
                cell.SetCellValue(dataCell);
                dataCell = DateTime.MaxValue;
            }
            else
            {
                cell.CellStyle = _cellStyle;
                cell.SetCellValue(value);
            }

(这不是最干净的代码,但我将不再重构后,得到这项工作)。

在遇到这个问题后,我想也许我会在构造函数中创建_cellStyle变量,并且根据具体情况只更改它的值,因为它无论如何都被分配给了新单元格,并且我在调试时看到对象值是正确的。

但创造了一切之后,也不会有任何好转。Styles被样式的最后一个值覆盖,并且日期也会被破坏,但在以后:创建单元格样式的一个实例后,重新创建excel工作簿

我已经没有想法了,也许我应该创建单元格样式的每一个组合(我只使用了很少的数据格式和对齐),但在我做这件事之前(因为我现在已经没有简单的选项了),我想知道你们认为应该在这里做什么。

单元格格式设置为日期类型自定义

共有1个答案

澹台冯浩
2023-03-14

我正在使用这段代码来创建我的自定义样式和格式。它适用于excel表格的XSSF格式。但它将适用于HSSF格式,但需要进行一些修改。

XSSFFont defaultFont = (XSSFFont)workbook.CreateFont();
defaultFont.FontHeightInPoints = (short)10;
defaultFont.FontName = "Arial";
defaultFont.Color = IndexedColors.Black.Index;
defaultFont.IsBold = false;
defaultFont.IsItalic = false;


XSSFCellStyle dateCellStyle = (XSSFCellStyle)workbook.CreateCellStyle();
XSSFDataFormat dateDataFormat = (XSSFDataFormat)workbook.CreateDataFormat();
dateCellStyle.SetDataFormat(dateDataFormat.GetFormat("m/d/yy h:mm")); //Replace format by m/dd/yyyy. try similar approach for phone number etc.
dateCellStyle.FillBackgroundColor = IndexedColors.LightYellow.Index;
//dateCellStyle.FillPattern = FillPattern.NoFill;
dateCellStyle.FillForegroundColor = IndexedColors.LightTurquoise.Index;
dateCellStyle.FillPattern = FillPattern.SolidForeground;
dateCellStyle.Alignment = HorizontalAlignment.Left;
dateCellStyle.VerticalAlignment = VerticalAlignment.Top;
dateCellStyle.BorderBottom = BorderStyle.Thin;
dateCellStyle.BorderTop = BorderStyle.Thin;
dateCellStyle.BorderLeft = BorderStyle.Thin;
dateCellStyle.BorderRight = BorderStyle.Thin;
dateCellStyle.SetFont(defaultFont);


//Apply your style to column 
  _sheetData.SetDefaultColumnStyle(columnIndex, dateCellStyle);  

// Or you can also apply style cell wise like 

  var row =  _sheetData.CreateRow(0);
for (int cellIndex = 0;cellIndex < TotalHeaderCount;cellIndex++)
  {
     row.Cells[cellIndex].CellStyle = dateCellStyle;
  }
 类似资料:
  • 我正在尝试使用更改整个Excel工作簿()的默认单元格样式。这应该应用于用户可能创建的新单元格(在保存工作簿之后)。我试图通过调用--我认为这是工作簿的默认样式--来实现这一点,然后将此样式修改为我想要的新默认样式。 当我读入一个现有的文件(一个“模板”文件)并修改默认样式时,这会起作用。但是,当我使用从头创建一个新的文件时,它就不起作用了。 当使用调试器单步执行时,我可以看到,当使用“模板”文件

  • 我想将工作簿的一页(包括样式)复制到新的工作簿。 我尝试对所有单元格进行迭代 抛出java.lang.IllegalStateException:超出了单元格样式的最大数目。在.xls工作簿中最多可以定义4000个样式 抛出java.lang.IllegalArgumentException:此样式不属于提供的工作簿。是否尝试将样式从一个工作簿分配到另一个工作簿的单元格? 正确的样式复制方法是什么

  • 然后另一个问题是工作簿的名称都不同,所有300个。是否有一个宏可以复制我打开的工作簿,而不是每次都输入实际的名称?

  • 我对宏是新手,需要帮助。我在一个文件夹中有几个工作簿,每个工作簿有四个工作表。现在我想要一个mocro它复制数据从每个工作簿(工作表明智)和过去在我的主工作簿(工作表明智)意味着数据1应该被粘贴一个在另一个下面在我的主工作簿在工作表1和工作表2分别。*工作簿名称可以是文件夹中的任何东西。有人能帮我完成整个代码吗?我有宏从一张表到我分配的表的数据,但它复制粘贴数据从打开的表,而不是按表名明智的。有人

  • 我对VBA相当陌生,请放心。我试图设置一种方法,从一个单元格区域(总是相同的)获取数据,并将这些数据输入到现有的主工作簿中。 null