Excel 如何使用OpenXML格式SDK从电子表格读取数据?
我需要使用OpenXMLSDK2.0从Excel2007工作簿中的单个工作表中读取数据。我花了很多时间寻找基本的指导方针,但我只找到了创建电子表格的帮助Excel 如何使用OpenXML格式SDK从电子表格读取数据?,excel,openxml,spreadsheetml,Excel,Openxml,Spreadsheetml,我需要使用OpenXMLSDK2.0从Excel2007工作簿中的单个工作表中读取数据。我花了很多时间寻找基本的指导方针,但我只找到了创建电子表格的帮助 如何使用此SDK迭代工作表中的行,然后迭代每行中的单元格?我这样做的方式是使用Linq。从使用SDK到只使用纯开放XML(没有SDK),在这个主题上有很多示例。看看: (使用纯 OpenXML,不是SDK,而是概念 (非常接近) (使用开放式XML SDK,假设 列表对象) (可能是最好的“总体介绍” 第(条) 另一个答案更像是元答案。自从
如何使用此SDK迭代工作表中的行,然后迭代每行中的单元格?我这样做的方式是使用Linq。从使用SDK到只使用纯开放XML(没有SDK),在这个主题上有很多示例。看看:
- (使用纯 OpenXML,不是SDK,而是概念 (非常接近)
- (使用开放式XML SDK,假设 列表对象)
- (可能是最好的“总体介绍” 第(条)
- 另一个答案更像是元答案。自从使用LINQ处理单独的文档部分以来,我一直在努力解决这个问题。下面的代码包含一个包装函数,用于从单元格中获取值,解析任何可能的字符串查找
public void ExcelDocTest()
{
Debug.WriteLine(“在工作表中运行”);
int rowsComplete=0;
使用(电子表格文档电子表格文档=
电子表格文档.Open(@“path\to\Spreadsheet.xlsx”,false))
{
WorkbookPart WorkbookPart=电子表格文档.WorkbookPart;
foreach(workBookPart.Workbook.Subjections()中的工作表s)
{
WorksheetPart wsPart=workBookPart.GetPartById(s.Id)作为工作表部件;
Debug.WriteLine(“工作表{1}:{2}-id({0}){3}”),s.id,s.SheetId,s.Name,
wsPart==null“未找到!”:“已找到”);
if(wsPart==null)
{
继续;
}
行[]行=wsPart.Worksheet.subjects().ToArray();
//假设第一行包含列名
foreach(wsPart.Worksheet.subjects()中的行)
{
rowsComplete++;
bool emptyRow=真;
List rowData=新列表();
字符串值;
foreach(行.Elements()中的单元格c)
{
值=GetCellValue(c);
emptyRow=emptyRow&&string.IsNullOrWhiteSpace(值);
rowData.Add(value);
}
WriteLine(“行{0}:{1}”,行,
emptyRow?“EMPTY!”:string.Join(“,”,rowData));
}
}
}
WriteLine(“完成,处理了{0}行。”,rowsComplete);
}
公共静态字符串GetCellValue(单元格)
{
if(单元格==null)
返回null;
if(cell.DataType==null)
返回cell.InnerText;
字符串值=cell.InnerText;
开关(cell.DataType.Value)
{
案例CellValues.SharedString:
//对于共享字符串,请在共享字符串表中查找该值。
//从单元格中获取工作表
OpenXmlElement父元素=cell.parent;
而(parent.parent!=null&&parent.parent!=parent
&&string.Compare(parent.LocalName,“工作表”,true)!=0)
{
父=父。父;
}
if(string.Compare(parent.LocalName,“工作表”,true)!=0)
{
抛出新异常(“无法找到父工作表”);
}
工作表ws=作为工作表的父级;
电子表格文档ssDoc=ws.WorksheetPart.OpenXmlPackage作为电子表格文档;
SharedStringTablePart sstPart=ssDoc.WorkbookPart.GetPartSoftType().FirstOrDefault();
//共享字符串表中的查找值
if(sstPart!=null&&sstPart.SharedStringTable!=null)
{
value=sstPart.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
}
打破
//案例中的此案例是从msdn复制的。
大小写单元格值。布尔值:
开关(值)
{
案例“0”:
value=“FALSE”;
打破
违约:
value=“TRUE”;
打破
}
打破
}
返回值;
}
编辑:感谢对GetCellValue()的更正。您有机会对此进行调查吗?如果我能帮上什么忙,请告诉我。是的,@Otaku,谢谢。“使用LINQ”这篇文章非常有用,尽管除了迭代行和单元格之外,我什么都不做,但它只展示了如何访问工作表。