【问题标题】:Read Excel Cell Format读取 Excel 单元格格式
【发布时间】:2014-01-20 17:32:41
【问题描述】:

我正在开发这个程序,它将读取 excel 文件中的数据并将其放入我们的数据库中。该程序是在 Visual Studio 2010 中使用 C# 编写的,我使用的是 NPOI 库。

过去,我可以逐行逐个单元格地读取电子表格来获取数据,但新格式的 excel 文件让我无法轻松做到这一点。 (excel是另一个用户给的,所以我不能对它做大的改动)。

一张表中有几个“表格”(每个列名使用边框和标题),我需要主要从表格中获取数据,但有时也需要在表格之外。

我想知道我是否要逐行阅读电子表格(这是我有点熟悉的),有没有办法告诉我我已经到达了一张桌子?有没有办法读取单元格的“格式”?

我的意思是,例如,“这个单元格周围有边框,所以从这一行开始是一个表格。”或“这个单元格中的文本是粗体的,所以这一行是这个新表的标题行。"

过去,我只能阅读电子表格的“文本”,而不能阅读格式/样式。我一直在互联网上搜索,我只能找到如何设置输出excel的样式,而不是如何从输入中读取格式。

感谢任何帮助,谢谢!

【问题讨论】:

    标签: c# excel npoi cell-formatting


    【解决方案1】:

    最好将源工作簿中的各种表定义为具有已知名称的命名范围。然后就可以像这样获取关联区域了-

    using System.IO;
    using System.Windows;
    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    
    // ...
            using (var file = new FileStream(workbookLocation, FileMode.Open, FileAccess.Read))
            {
              var workbook = new XSSFWorkbook(file);
              var nameInfo = workbook.GetName("TheTable");
              var tableRange = nameInfo.RefersToFormula;
              // Do stuff with the table
            }
    

    如果您无法控制源电子表格并且无法将表格定义为命名范围,则可以按照您的建议读取单元格格式。下面是一个读取TopBorder样式的例子-

            using (var file = new FileStream(workbookLocation, FileMode.Open, FileAccess.Read))
            {
                var workbook = new XSSFWorkbook(file);
                var sheet = workbook.GetSheetAt(0);
    
                for (int rowNo = 0; rowNo <= sheet.LastRowNum; rowNo++)
                {
                    var row = sheet.GetRow(rowNo);
                    if (row == null) // null is when the row only contains empty cells 
                        continue;
                    for (int cellNo = 0; cellNo <= row.LastCellNum; cellNo++)
                    {
                        var cell = row.GetCell(cellNo);
                        if (cell == null) // null is when the cell is empty
                            continue;
                        var topBorderStyle = cell.CellStyle.BorderTop;
                        if (topBorderStyle != BorderStyle.None)
                        {
                            MessageBox.Show(string.Format("Cell row: {0} column: {1} has TopBorder: {2}", cell.Row.RowNum, cell.ColumnIndex, topBorderStyle));
                        }
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2015-07-16
      • 2022-07-12
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多