我正在研究这个程序,它将读取excel文件中的数据并将其放入我们的数据库中。该程序是使用C#在Visual Studio 2010中编写的,我正在使用NPOI库。
过去,我能够逐行读取电子表格以逐个单元格来获取数据,但excel文件的新格式不允许我轻松地执行此操作。 (excel是由另一个用户提供的,所以我无法对其进行重大更改。)
一张表中有几个“表”(每个列名使用边框和标题),我需要主要从表中获取数据,但有时也需要在表外部。
我想知道我是否要逐行阅读电子表格(这是我有点熟悉的),有没有办法告诉我已经到了桌子?有没有办法可以阅读单元格的“格式”?
我的意思是,例如,“这个单元格周围有边框,所以从这一行开始是一个表。”或“此单元格中的文本是粗体,所以这一行是这个新表的标题行。“
过去我只能阅读电子表格的“文本”而不是格式/样式。我一直在互联网上搜索,我只能找到如何设置输出excel的样式,而不是如何从输入中读取格式。
感谢任何帮助,谢谢!
答案 0 :(得分:2)
最好将源工作簿中的各个表定义为具有已知名称的命名范围。然后你就可以得到像这样的相关区域 -
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));
}
}
}
}