我想在我的项目中实现openXmlsdk2.5。我在这个link中做了所有的事情
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.IO.Packaging;
static void Main(string[] args)
{
String fileName = @"C:\OPENXML\BigData.xlsx";
// Comment one of the following lines to test the method separately.
ReadExcelFileDOM(fileName); // DOM
//ReadExcelFileSAX(fileName); // SAX
}
// The DOM approach.
// Note that the code below works only for cells that contain numeric values.
//
static void ReadExcelFileDOM(string fileName)
{
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
string text;
int rowCount= sheetData.Elements<Row>().Count();
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
text = c.CellValue.Text;
Console.Write(text + " ");
}
}
Console.WriteLine();
Console.ReadKey();
}
}
但是我没有得到任何行。它没有进入循环。注意:我还设置了openXml sdk 2.5我的电脑
我发现下面的代码这是工作的数值。字符串值写0 1 2 ...
private static void Main(string[] args)
{
var filePath = @"C:/OPENXML/BigData.xlsx";
using (var document = SpreadsheetDocument.Open(filePath, false))
{
var workbookPart = document.WorkbookPart;
var workbook = workbookPart.Workbook;
var sheets = workbook.Descendants<Sheet>();
foreach (var sheet in sheets)
{
var worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
var sharedStringPart = workbookPart.SharedStringTablePart;
//var values = sharedStringPart.SharedStringTable.Elements<SharedStringItem>().ToArray();
string text;
var rows = worksheetPart.Worksheet.Descendants<Row>();
foreach (var row in rows)
{
Console.WriteLine();
int count = row.Elements<Cell>().Count();
foreach (Cell c in row.Elements<Cell>())
{
text = c.CellValue.InnerText;
Console.Write(text + " ");
}
}
}
}
Console.ReadLine();
}
4条答案
按热度按时间s6fujrry1#
你的方法对我来说似乎还可以--因为它确实“进入了循环”。不过,你也可以尝试如下所示的方法:
我使用filestream方法打开工作簿,因为这允许您使用共享访问打开它,以便您可以同时在Excel中打开工作簿。如果工作簿在其他位置打开,则Spreadsheet.Open(...方法将不起作用。
也许这就是你的代码不起作用的原因。
还要注意,在适当的地方使用SharedStringTable来获取单元格文本。
编辑日期:2018年7月11日:
由于这篇文章仍然在获得投票,我还应该指出,在许多情况下,使用ClosedXML来操作/阅读/编辑您的工作簿可能要容易得多。文档示例非常用户友好,编码是,在我有限的经验,更直接。只是要知道它不会(然而)实现所有Excel函数(例如INDEX和MATCH),这可能是问题,也可能不是问题。[无论如何,我并不想尝试在OpenXML中处理INDEX和MATCH。]
6ss1mwsb2#
我和OP遇到了同样的问题,上面的答案对我不起作用。
我认为这就是问题所在:当您在Excel中创建文档时(不是以编程方式),默认情况下您有3个工作表,并且包含Sheet1的行数据的WorksheetParts是最后一个WorksheetParts元素,而不是第一个。
我在Visual Studio中为document. WorkbookPart. WorksheetParts设置了一个监视器,展开Results,然后查看所有子元素,直到找到一个其中HasChildren = true的SheetData对象。
试试这个:
ryevplcw3#
读取大型Excel:openxml有DOM和SAX两种方法来读取Excel。DOM方法消耗更多的RAM资源,因为它将整个xml内容(Excel文件)加载到内存中,但其强类型方法。SAX另一方面是基于事件的解析。more here
因此,如果你面对的是大型excel文件,最好使用SAX。
下面代码示例使用SAX方法,并处理Excel文件阅读中的两个重要场景。
1.打开xml跳过这空单元格所以你的数据集面临位移和错误的索引.
1.你也需要跳过空行。
这个函数返回单元格在那时的确切的实际索引并处理第一个场景.从这里
代码读取excel sax的方法。
uyto3xhc4#
一切都在公认答案中解释。
这里只是一个扩展的方法来解决这个问题