CellStyle意外地应用于工作表中的所有单元格 - NPOI?

时间:2013-04-10 21:47:28

标签: c# export-to-excel npoi

我不明白为什么会发生这种情况,首先我尝试在第一行的列标题中应用粗体文本,然后我想将标题单元格的边框设置为MEDIUM,但此MEDIUM边框样式适用于表格中的所有单元格。以下相同代码中存在更多问题:

  1. 我的列标题中的文字(在第一行中)不是我想要的粗体。
  2. 我的列标题中的文字颜色不是我想要的红色。
  3. 这是我的代码(使用NPOI库处理):

    private void CreateATest(string filename)
        {
            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write);
            HSSFWorkbook wb = new HSSFWorkbook();
            ISheet sheet = wb.CreateSheet("NPOI");
            IRow row = sheet.CreateRow(0);
            row.RowStyle = wb.CreateCellStyle();
            row.RowStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
    
            row.RowStyle.VerticalAlignment = VerticalAlignment.CENTER;            
            row.RowStyle.WrapText = true;
            IFont font = wb.CreateFont();
            font.Boldweight = 3;
            font.Color = (short) ColorTranslator.ToWin32(Color.Red);
            font.FontHeight = 30;
            row.RowStyle.SetFont(font);
            int i = 0;
            foreach (string header in new string[] { "ID", "Name", "Age" })
            {
                row.CreateCell(i++).SetCellValue(header);
                row.Cells[i - 1].CellStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.MEDIUM;
                row.Cells[i - 1].CellStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.MEDIUM;
                row.Cells[i - 1].CellStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.MEDIUM;
            }
            row.Cells[i - 1].CellStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.MEDIUM;
            Random rand = new Random();
            for (i = 1; i < 1000; i++)
            {
                IRow row1 = sheet.CreateRow(i);
                for (int j = 0; j < 3; j++)
                {
                    row1.CreateCell(j).SetCellValue(rand.Next(100));
                }
            }
            wb.Write(fs);
            fs.Close();
        }
    

    请为我修好,我对NPOI很新,刚尝试使用它。非常感谢您的帮助。 谢谢。 (&lt; ---我不知道为什么这个'谢谢'无法跳到下一行,即使我在键入之前输入了Enter键)

3 个答案:

答案 0 :(得分:6)

格式化问题是由Excel格式化插入行的方式引起的。他们从上面的行中获取他们的样式信息。你可以通过将行格式化为粗体,然后在下面插入一行来测试这一点 - 新行也将以粗体显示。您可以先尝试插入其余的行,然后再对标题行进行格式化。不幸的是,我没有足够的声誉来评论这个而不是答案,因为我无法帮助你处理其他两个问题。

答案 1 :(得分:1)

这是解决方案 - 我遇到了同样的问题。 您需要创建一个离散的ICellStyle并将其分配给单元格的CellStyle,而不是仅仅在单元格的当前CellStyle上调用“SetFont()”。

我遇到的问题是将样式应用于所有单元格。我评论了导致它的那一行,下一行是有效的(和ICellStyle部分):

        let workbook:HSSFWorkbook = new HSSFWorkbook()
        let worksheet:ISheet =  workbook.CreateSheet(sheetName)

        let fontbold = workbook.CreateFont()
        fontbold.Boldweight <- (int16 FontBoldWeight.Bold)
        fontbold.FontHeightInPoints <- 10s
        fontbold.FontName <- "Arial"

        let cellstylebold:ICellStyle = workbook.CreateCellStyle()
        cellstylebold.SetFont(fontbold)

        let row:IRow = worksheet.CreateRow(0)

        for h in 0..headers.Length-1 do
            let cell = row.CreateCell(h)
            cell.SetCellValue(headers.[h])
            //cell.CellStyle.SetFont(fontbold)
            cell.CellStyle <- cellstylebold

答案 2 :(得分:0)

Rory要求的一种可能的解决方案是在创建单元格时设置CellStyle,然后再使用GetCell(x)设置值。

我遇到了同样的错误,因为在创建CellStyle之后,我试图更改CellStyle,并决定以这种方式更改顺序:

//CREATE STYLE
ICellStyle styleCenter1 = hssfworkbook.CreateCellStyle();
styleCenter1.Alignment = HorizontalAlignment.Center;
styleCenter1.VerticalAlignment = VerticalAlignment.Center;
styleCenter1.WrapText = true;
styleCenter1.SetFont(font1);

//CREATE ROW
IRow row = sheet1.CreateRow(z);

//SETTING CELLSTYLE WHILE CREATING CELL
row.CreateCell(0).CellStyle = styleCenter1;

//SETTING CELLVALUE AFTER
row.GetCell(0).SetCellValue(listaSocieta[x]);

Ciao

雷蒙多