簡體   English   中英

POI / NPOI中的工作簿單元格樣式不適用於工作簿中的多種樣式

[英]Workbook cell style in POI/NPOI doesn't work properly with multiple styles in workbook

我正在為Excel電子表格的POI庫的.Net版本遇到一個奇怪的問題。 我正在將文本文件重寫為Excel 97-2003文檔,並且我想以編程方式添加一些格式,這取決於在程序開始時收集的一些值。

最初,我使用給定值創建新單元格的同一方法中,我還創建了一個新的Workbook CellStyle,這是錯誤的,因為我很快就用完了樣式(或者我只是認為這是原因問題)。

負責Excel Workbook的類的構造方法:

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變量,並且僅根據情況更改其值,因為無論如何它都已分配給新單元格,並且在調試對象時看到正確的值。

但是創建完所有內容之后,它不會再變得更好了。 樣式被樣式的最后一個值覆蓋,日期也被破壞,但后來: 創建一個單元格樣式實例后對excel工作簿進行screnshoot

我沒有足夠的想法,也許我應該創建單元格樣式的每種組合(我只使用幾種數據格式和對齊方式),但是在執行此操作之前(因為我現在沒有簡單的選擇了),我想知道你們認為應該在這里做什么。

單元格格式設置為自定義日期類型

我正在使用此代碼創建我的自定義樣式和格式。 適用於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;
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM