gpt4 book ai didi

c# - 使用 OpenXmlReader

转载 作者:可可西里 更新时间:2023-11-01 08:05:54 24 4
gpt4 key购买 nike

我讨厌求助于 StackOverflow 来处理如此(看似)基本的事情,但过去几个小时我一直在与 Microsoft 争论不休,似乎走到了死胡同。我正在尝试阅读(大)Excel 2007+ 电子表格,Google 好心地告诉我,使用 OpenXml SDK 是一个非常受欢迎的选择。所以我尝试了一下,阅读了一些教程,检查了 Microsoft 自己的库页面,但从中获益甚微。

我正在使用一个只有一列数字和一列字符串的小型测试电子表格 - 稍后会进行大规模测试。我已经尝试了几种与我即将发布的类似的实现,但它们都没有读取数据。下面的代码主要取自另一个 StackOverflow 线程,它似乎在那里工作 - 对我来说不是这样。我想我会让你们检查/调试/帮助这个版本,因为它可能比我今天写的任何东西都更少损坏。

static void ReadExcelFileSAX(string fileName)
{
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, true))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();

OpenXmlPartReader reader = new OpenXmlPartReader(worksheetPart);
string text;
string rowNum;
while (reader.Read())
{
if (reader.ElementType == typeof(Row))
{
do
{
if (reader.HasAttributes)
{
rowNum = reader.Attributes.First(a => a.LocalName == "r").Value;
Console.Write("rowNum: " + rowNum); //we never even get here, I tested it with a breakpoint
}

} while (reader.ReadNextSibling()); // Skip to the next row
Console.ReadKey();
break; // We just looped through all the rows so no need to continue reading the worksheet
}
if (reader.ElementType == typeof(Cell))
{

}

if (reader.ElementType != typeof(Worksheet)) // Dont' want to skip the contents of the worksheet
reader.Skip(); // Skip contents of any node before finding the first row.
}
reader.Close();
Console.WriteLine();
Console.ReadKey();
}
}

另外,除了使用我不知何故错过的 OpenXml SDK 之外,还有什么好的替代方法吗?

最佳答案

我认为您使用了错误的 WorksheetPart 来读取行。

线

workbookPart.WorksheetParts.First();

获取集合的第一个 WorksheetPart一定是您在 Microsoft Excel 中看到的第一个工作表。

因此,遍历所有 WorksheetParts,您应该会在您的控制台窗口。

static void ReadExcelFileSAX(string fileName)
{
using (SpreadsheetDocument spreadsheetDocument =
SpreadsheetDocument.Open(fileName, true))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;

// Iterate through all WorksheetParts
foreach (WorksheetPart worksheetPart in workbookPart.WorksheetParts)
{
OpenXmlPartReader reader = new OpenXmlPartReader(worksheetPart);
string text;
string rowNum;
while (reader.Read())
{
if (reader.ElementType == typeof(Row))
{
do
{
if (reader.HasAttributes)
{
rowNum = reader.Attributes.First(a => a.LocalName == "r").Value;
Console.Write("rowNum: " + rowNum);
}

} while (reader.ReadNextSibling()); // Skip to the next row

break; // We just looped through all the rows so no
// need to continue reading the worksheet
}

if (reader.ElementType != typeof(Worksheet))
reader.Skip();
}
reader.Close();
}
}
}

要读取所有单元格值,请使用以下函数(省略所有错误处理细节):

static void ReadAllCellValues(string fileName)
{
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, false))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;

foreach(WorksheetPart worksheetPart in workbookPart.WorksheetParts)
{
OpenXmlReader reader = OpenXmlReader.Create(worksheetPart);

while (reader.Read())
{
if (reader.ElementType == typeof(Row))
{
reader.ReadFirstChild();

do
{
if (reader.ElementType == typeof(Cell))
{
Cell c = (Cell)reader.LoadCurrentElement();

string cellValue;

if (c.DataType != null && c.DataType == CellValues.SharedString)
{
SharedStringItem ssi = workbookPart.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(c.CellValue.InnerText));

cellValue = ssi.Text.Text;
}
else
{
cellValue = c.CellValue.InnerText;
}

Console.Out.Write("{0}: {1} ", c.CellReference, cellValue);
}
} while (reader.ReadNextSibling());
Console.Out.WriteLine();
}
}
}
}
}

在上面的代码中,您看到数据类型为 SharedString 的单元格必须使用SharedStringTablePart

关于c# - 使用 OpenXmlReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com