为什么无法使用 XML SDK 2.0 C# 读取早于 2013 的 excel 文件版本
Why cannot read excel file version older than 2013 with XML SDK 2.0 C#
所以我写了一些代码,主要是尝试使用 XML SDK 读取 excel 文件。这是我在 Visual Studio 2010 上用 C# 编写的代码。我将代码放在底部,但基本上我遇到的问题是它会读取任何 excel 2013 版本的文件。任何早于 2013 的 excel 版本都不会被读取。更具体地说,当 excel 版本早于 2013 时,程序不会进入 foreach 循环。有什么想法吗?
static void ReadExcelFile(string fileName)
{
//open the file
using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(fileName, true))
{
//workbook part captcure
WorkbookPart workbookPart = myDoc.WorkbookPart;
//then access to the worksheet part
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
//find sheet data
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
string text = c.CellValue.Text;
Console.WriteLine(text);
}
}
Console.ReadKey();
}
}
这应该可以解决问题。这里我提供了一个自我解释的代码示例。
我用 Excel 2010 版本测试过这个。在我看来,MSDN 声明您的版本仅适用于 Excel 2013,并且仅适用于单元格包含数字的情况。在给定的示例中,我没有使用 LINQ 来获取元素,而是手动遍历了各个部分。
//open the file
using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(path, true))
{
//Get workbookpart
WorkbookPart workbookPart = myDoc.WorkbookPart;
// Extract the workbook part
var stringtable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
//then access to the worksheet part
IEnumerable<WorksheetPart> worksheetPart = workbookPart.WorksheetParts;
foreach (WorksheetPart WSP in worksheetPart)
{
//find sheet data
IEnumerable<SheetData> sheetData = WSP.Worksheet.Elements<SheetData>();
foreach (SheetData SD in sheetData)
{
foreach (Row row in SD.Elements<Row>())
{
// For each cell we need to identify type
foreach (Cell cell in row.Elements<Cell>())
{
if (cell.DataType == null && cell.CellValue != null)
{
// Check for pure numbers
Console.WriteLine(cell.CellValue.Text);
}
else if (cell.DataType.Value == CellValues.Boolean)
{
// Booleans
Console.WriteLine(cell.CellValue.Text);
}
else if (cell.CellValue != null)
{
// A shared string
if (stringtable != null)
{
// Cell value holds the shared string location
Console.WriteLine(stringtable.SharedStringTable.ElementAt(int.Parse(cell.CellValue.Text)).InnerText);
}
}
else {
Console.WriteLine("A broken book");
}
}
}
}
}
所以我写了一些代码,主要是尝试使用 XML SDK 读取 excel 文件。这是我在 Visual Studio 2010 上用 C# 编写的代码。我将代码放在底部,但基本上我遇到的问题是它会读取任何 excel 2013 版本的文件。任何早于 2013 的 excel 版本都不会被读取。更具体地说,当 excel 版本早于 2013 时,程序不会进入 foreach 循环。有什么想法吗?
static void ReadExcelFile(string fileName)
{
//open the file
using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(fileName, true))
{
//workbook part captcure
WorkbookPart workbookPart = myDoc.WorkbookPart;
//then access to the worksheet part
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
//find sheet data
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
string text = c.CellValue.Text;
Console.WriteLine(text);
}
}
Console.ReadKey();
}
}
这应该可以解决问题。这里我提供了一个自我解释的代码示例。
我用 Excel 2010 版本测试过这个。在我看来,MSDN 声明您的版本仅适用于 Excel 2013,并且仅适用于单元格包含数字的情况。在给定的示例中,我没有使用 LINQ 来获取元素,而是手动遍历了各个部分。
//open the file
using (SpreadsheetDocument myDoc = SpreadsheetDocument.Open(path, true))
{
//Get workbookpart
WorkbookPart workbookPart = myDoc.WorkbookPart;
// Extract the workbook part
var stringtable = workbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
//then access to the worksheet part
IEnumerable<WorksheetPart> worksheetPart = workbookPart.WorksheetParts;
foreach (WorksheetPart WSP in worksheetPart)
{
//find sheet data
IEnumerable<SheetData> sheetData = WSP.Worksheet.Elements<SheetData>();
foreach (SheetData SD in sheetData)
{
foreach (Row row in SD.Elements<Row>())
{
// For each cell we need to identify type
foreach (Cell cell in row.Elements<Cell>())
{
if (cell.DataType == null && cell.CellValue != null)
{
// Check for pure numbers
Console.WriteLine(cell.CellValue.Text);
}
else if (cell.DataType.Value == CellValues.Boolean)
{
// Booleans
Console.WriteLine(cell.CellValue.Text);
}
else if (cell.CellValue != null)
{
// A shared string
if (stringtable != null)
{
// Cell value holds the shared string location
Console.WriteLine(stringtable.SharedStringTable.ElementAt(int.Parse(cell.CellValue.Text)).InnerText);
}
}
else {
Console.WriteLine("A broken book");
}
}
}
}
}