![](/img/trans.png)
[英]How to - Conditional formatting on a cell if its value equals a value of another cell in ANY tab of the Workbook
[英]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.