C# 使用OpenXMLSDK获取所有单元格值作为字符串

C# 使用OpenXMLSDK获取所有单元格值作为字符串,c#,excel,openxml-sdk,C#,Excel,Openxml Sdk,我想以类似SAX的方式使用OpenXMLSDKv2.0阅读Excel2007+文档。我用这篇博文作为粗略的指南: 然而,在我的文档中,我混合了字符串和数值。因此,字符串值被存储为SharedString,因此当为这样一个单元格读取CellValue时,我会得到一个数字,我读取的是索引(因此需要获取InnerText)。这似乎增加了太多的复杂性。我是否可以简单地将工作表中的所有单元格视为文本/字符串,并以类似于blog posts示例的方式遍历所有单元格以获取值 谢谢以下内容是否有帮助 List&

我想以类似SAX的方式使用OpenXMLSDKv2.0阅读Excel2007+文档。我用这篇博文作为粗略的指南:

然而,在我的文档中,我混合了字符串和数值。因此,字符串值被存储为SharedString,因此当为这样一个单元格读取CellValue时,我会得到一个数字,我读取的是索引(因此需要获取InnerText)。这似乎增加了太多的复杂性。我是否可以简单地将工作表中的所有单元格视为文本/字符串,并以类似于blog posts示例的方式遍历所有单元格以获取值


谢谢

以下内容是否有帮助

List<string> listShared = new List<string>();
using (SpreadsheetDocument xl = SpreadsheetDocument.Open("YourFile.xlsx", false))
{
    SharedStringItem ssi;
    using (OpenXmlReader oxrShared = OpenXmlReader.Create(xl.WorkbookPart.SharedStringTablePart))
    {
        while (oxrShared.Read())
        {
            if (oxrShared.ElementType == typeof(SharedStringItem))
            {
                ssi = (SharedStringItem)oxrShared.LoadCurrentElement();
                // this assumes the shared string is a simple text format, instead of rich text.
                listShared.Add(ssi.Text.Text);
            }
        }
    }

    WorksheetPart wsp = xl.WorkbookPart.WorksheetParts.First();
    Cell c;
    using (OpenXmlReader oxrCells = OpenXmlReader.Create(wsp))
    {
        while (oxrCells.Read())
        {
            if (oxrCells.ElementType == typeof(Cell))
            {
                c = (Cell)oxrCells.LoadCurrentElement();
                // c.CellReference holds a string such as "A1"
                if (c.DataType != null)
                {
                    if (c.DataType == CellValues.SharedString)
                    {
                        // use whichever from-string-to-number conversion
                        // you like.
                        //listShared[Convert.ToInt32(c.CellValue.Text)];
                    }
                    else if (c.DataType == CellValues.Number)
                    {
                        // "normal" value
                        //c.CellValue.Text;
                    }
                    // there's also boolean, which you might be interested
                    // as well as other types
                }
                else
                {
                    // is by default a Number. Use this:
                    //c.CellValue.Text;
                }
            }
        }
    }
}
List listShared=new List();
使用(SpreadsheetDocument xl=SpreadsheetDocument.Open(“YourFile.xlsx”,false))
{
SharedStringItem ssi;
使用(OpenXmlReader-oxrShared=OpenXmlReader.Create(xl.WorkbookPart.SharedStringTablePart))
{
while(oxrShared.Read())
{
if(oxrShared.ElementType==typeof(SharedStringItem))
{
ssi=(SharedStringItem)oxrShared.LoadCurrentElement();
//这假设共享字符串是简单的文本格式,而不是富文本。
添加(ssi.Text.Text);
}
}
}
WorksheetPart wsp=xl.WorkbookPart.WorksheetParts.First();
细胞c;
使用(OpenXmlReader-oxrCells=OpenXmlReader.Create(wsp))
{
while(oxrCells.Read())
{
if(oxrCells.ElementType==typeof(单元格))
{
c=(单元格)oxrCells.LoadCurrentElement();
//c.CellReference包含一个字符串,如“A1”
if(c.DataType!=null)
{
if(c.DataType==CellValues.SharedString)
{
//使用从字符串到数字的转换
//你喜欢。
//listShared[Convert.ToInt32(c.CellValue.Text)];
}
else if(c.DataType==CellValues.Number)
{
//“正常”值
//c、 CellValue.Text;
}
//还有布尔值,您可能会感兴趣
//以及其他类型
}
其他的
{
//默认情况下是一个数字。请使用:
//c、 CellValue.Text;
}
}
}
}
}
注意:没有错误界限检查或空值检查。它旨在说明如何以尽可能最简单的方式获取共享字符串

此外,共享字符串列表被假定为“简单”共享字符串,这意味着没有富文本


逻辑是将工作表中的共享字符串列表加载到一个可以轻松操作的列表中。然后在遍历单元格时,如果看到数据类型为SharedString的单元格,可以再次检查列表。如果单元格的数据类型为数字,请照常进行。

非常感谢。有没有办法获取CellReference的列号和行号(整数)?也许我需要使用DOM方法,这样我就可以在行和列上建立索引。。。