从excel文件中打开xml读取

我想在我的项目中实现openXml sdk 2.5。我在此链接中进行了所有操作

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();

}

回答:

您的方法对我来说似乎行得通-因为它确实“进入了循环”。不过,您也可以尝试以下操作:

void Main()

{

string fileName = @"c:\path\to\my\file.xlsx";

using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))

{

using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, false))

{

WorkbookPart workbookPart = doc.WorkbookPart;

SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();

SharedStringTable sst = sstpart.SharedStringTable;

WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

Worksheet sheet = worksheetPart.Worksheet;

var cells = sheet.Descendants<Cell>();

var rows = sheet.Descendants<Row>();

Console.WriteLine("Row count = {0}", rows.LongCount());

Console.WriteLine("Cell count = {0}", cells.LongCount());

// One way: go through each cell in the sheet

foreach (Cell cell in cells)

{

if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))

{

int ssid = int.Parse(cell.CellValue.Text);

string str = sst.ChildElements[ssid].InnerText;

Console.WriteLine("Shared string {0}: {1}", ssid, str);

}

else if (cell.CellValue != null)

{

Console.WriteLine("Cell contents: {0}", cell.CellValue.Text);

}

}

// Or... via each row

foreach (Row row in rows)

{

foreach (Cell c in row.Elements<Cell>())

{

if ((c.DataType != null) && (c.DataType == CellValues.SharedString))

{

int ssid = int.Parse(c.CellValue.Text);

string str = sst.ChildElements[ssid].InnerText;

Console.WriteLine("Shared string {0}: {1}", ssid, str);

}

else if (c.CellValue != null)

{

Console.WriteLine("Cell contents: {0}", c.CellValue.Text);

}

}

}

}

}

}

我使用文件流方法来打开工作簿,因为它允许您使用共享访问权限来打开它-

这样您就可以同时在Excel中打开工作簿。如果工作簿在其他位置打开,则Spreadsheet.Open(…方法将不起作用。

也许这就是为什么您的代码无法正常工作的原因。

还要注意,在适当的地方使用SharedStringTable来获取单元格文本。

由于该帖子仍在获得投票,我还应该指出,在许多情况下,使用ClosedXML操作/阅读/编辑工作簿可能会容易得多。这些文档示例非常易于使用,根据我的有限经验,编码非常简单。请注意,它尚未(尚未)实现可能是或不是问题的所有Excel函数(例如INDEX和MATCH)。[不是我想无论如何都要尝试处理OpenXML中的INDEX和MATCH。]

以上是 从excel文件中打开xml读取 的全部内容, 来源链接: utcz.com/qa/422489.html

回到顶部