在 C# OpenXML 中读取 .xlsx
Reading .xlsx in C# OpenXML
我正在尝试查看是否可以通过 OpenXML 将 .xlsx 文件读取到使用 C# 的 gridview 中
我已经通过 OleDB 连接完成了,但我想尝试使用 OpenXML。 gridview 是解决这个问题的方法还是我应该以其他方式处理它给出的数据?
另外,如果有人进一步阅读 material 有关使用 OpenXML 导入的内容,那将会很方便,因为目前网络似乎还很稀少。
编辑:
所以在下面的 link 之后我带着这个回来了:
using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(xlsxFilePath, true))
{
//Access the main Workbook part, which contains data
WorkbookPart workbookPart = myWorkbook.WorkbookPart;
WorksheetPart worksheetPart = null;
if (!string.IsNullOrEmpty(sheetName))
{
Sheet ss = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).SingleOrDefault<Sheet>();
worksheetPart = (WorksheetPart)workbookPart.GetPartById(ss.Id);
}
else
{
worksheetPart = workbookPart.WorksheetParts.FirstOrDefault();
}
SharedStringTablePart stringTablePart = workbookPart.SharedStringTablePart;
if (worksheetPart != null)
{
Row lastRow = worksheetPart.Worksheet.Descendants<Row>().LastOrDefault();
Row firstRow = worksheetPart.Worksheet.Descendants<Row>().FirstOrDefault();
if (firstRow != null)
{
foreach (Cell c in firstRow.ChildElements)
{
string value = GetValue(c, stringTablePart);
dt.Columns.Add(value);
}
}
if (lastRow != null)
{
for (var i = 2; i <= lastRow.RowIndex; i++)
{
DataRow dr = dt.NewRow();
var empty = true;
Row row = worksheetPart.Worksheet.Descendants<Row>().Where(r => i == r.RowIndex).FirstOrDefault();
var j = 0;
if (row != null)
{
foreach (Cell c in row.ChildElements)
{
//Get cell value
string value = GetValue(c, stringTablePart);
if (!string.IsNullOrEmpty(value) && value != "")
{
empty = false;
}
dr[j] = value;
j++;
if (j == dt.Columns.Count)
{
break;
}
}
if (empty)
{
break;
}
dt.Rows.Add(dr);
}
}
}
}
}
return dt;
}
我遇到的问题是我必须指定 sheet 名称 - 这可能超出了可能的范围但是是否有一个选项来获取当前的 sheet 名称和然后让用户单击他们希望程序读取的 sheet - 例如弹出组合框?
要在 C# 中操作 openxml,您可以使用 openxml SDK(可在此处获取:https://msdn.microsoft.com/en-us/library/office/bb448854.aspx)。
- 更多关于读取文件的介绍:https://msdn.microsoft.com/en-us/library/dd440953(v=office.12).aspx
- 还有更多关于 Excel 的信息:https://msdn.microsoft.com/en-us/library/office/hh180830(v=office.14).aspx
对于您的问题,我认为没有嵌入式解决方案 "Excel2Gridview" 但操作应该不会很困难。
在网上快速浏览一下,您会发现反向问题 "gridview to Excel"。因此,如果您采用这样的解决方案 https://social.msdn.microsoft.com/Forums/office/en-US/20d517d0-fb70-4879-b595-71b6d57be0ae/export-grid-view-to-excel-mysql?forum=exceldev,请应用反向方法将您的 excel 转换为 gridview
更新
要检索工作表名称,请查看:https://msdn.microsoft.com/en-us/library/office/bb507946.aspx
要向用户列出工作表名称,您可以创建如下表单:
- 用于打开 excel 文件的对话框
- 检索工作表名称
- 向用户建议一个带有名称的组合框
- 如果 "ok",使用所选的工作表名称执行您的函数
我正在尝试查看是否可以通过 OpenXML 将 .xlsx 文件读取到使用 C# 的 gridview 中
我已经通过 OleDB 连接完成了,但我想尝试使用 OpenXML。 gridview 是解决这个问题的方法还是我应该以其他方式处理它给出的数据?
另外,如果有人进一步阅读 material 有关使用 OpenXML 导入的内容,那将会很方便,因为目前网络似乎还很稀少。
编辑:
所以在下面的 link 之后我带着这个回来了:
using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(xlsxFilePath, true))
{
//Access the main Workbook part, which contains data
WorkbookPart workbookPart = myWorkbook.WorkbookPart;
WorksheetPart worksheetPart = null;
if (!string.IsNullOrEmpty(sheetName))
{
Sheet ss = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).SingleOrDefault<Sheet>();
worksheetPart = (WorksheetPart)workbookPart.GetPartById(ss.Id);
}
else
{
worksheetPart = workbookPart.WorksheetParts.FirstOrDefault();
}
SharedStringTablePart stringTablePart = workbookPart.SharedStringTablePart;
if (worksheetPart != null)
{
Row lastRow = worksheetPart.Worksheet.Descendants<Row>().LastOrDefault();
Row firstRow = worksheetPart.Worksheet.Descendants<Row>().FirstOrDefault();
if (firstRow != null)
{
foreach (Cell c in firstRow.ChildElements)
{
string value = GetValue(c, stringTablePart);
dt.Columns.Add(value);
}
}
if (lastRow != null)
{
for (var i = 2; i <= lastRow.RowIndex; i++)
{
DataRow dr = dt.NewRow();
var empty = true;
Row row = worksheetPart.Worksheet.Descendants<Row>().Where(r => i == r.RowIndex).FirstOrDefault();
var j = 0;
if (row != null)
{
foreach (Cell c in row.ChildElements)
{
//Get cell value
string value = GetValue(c, stringTablePart);
if (!string.IsNullOrEmpty(value) && value != "")
{
empty = false;
}
dr[j] = value;
j++;
if (j == dt.Columns.Count)
{
break;
}
}
if (empty)
{
break;
}
dt.Rows.Add(dr);
}
}
}
}
}
return dt;
}
我遇到的问题是我必须指定 sheet 名称 - 这可能超出了可能的范围但是是否有一个选项来获取当前的 sheet 名称和然后让用户单击他们希望程序读取的 sheet - 例如弹出组合框?
要在 C# 中操作 openxml,您可以使用 openxml SDK(可在此处获取:https://msdn.microsoft.com/en-us/library/office/bb448854.aspx)。
- 更多关于读取文件的介绍:https://msdn.microsoft.com/en-us/library/dd440953(v=office.12).aspx
- 还有更多关于 Excel 的信息:https://msdn.microsoft.com/en-us/library/office/hh180830(v=office.14).aspx
对于您的问题,我认为没有嵌入式解决方案 "Excel2Gridview" 但操作应该不会很困难。 在网上快速浏览一下,您会发现反向问题 "gridview to Excel"。因此,如果您采用这样的解决方案 https://social.msdn.microsoft.com/Forums/office/en-US/20d517d0-fb70-4879-b595-71b6d57be0ae/export-grid-view-to-excel-mysql?forum=exceldev,请应用反向方法将您的 excel 转换为 gridview
更新
要检索工作表名称,请查看:https://msdn.microsoft.com/en-us/library/office/bb507946.aspx
要向用户列出工作表名称,您可以创建如下表单:
- 用于打开 excel 文件的对话框
- 检索工作表名称
- 向用户建议一个带有名称的组合框
- 如果 "ok",使用所选的工作表名称执行您的函数