【问题标题】:Reading an uploaded Excel file读取上传的 Excel 文件
【发布时间】:2016-10-13 12:15:20
【问题描述】:

我正在构建一个快速概念验证项目,以展示解析 excel 文件的能力。根据 Microsoft 文档 (How to parse and read a large spreadsheet document),似乎选择的 sdk 是 Open Xml

概念证明为用户上传文件 (.xlsx) 提供了基本形式。控制器读取文件并返回内容。我正在努力获取单元格的值,相反,我似乎只能获得某种标识符或对文本的引用。这是我的代码和一些示例

查看

@using(Html.BeginForm("Index", "Home", FormMethod.Post, new{ enctype="multipart/form-data" } ))
{
    <input type="file" name="file"/>
    <input type="submit"/>
}
<br/>
@Html.Raw(ViewBag.Text)

动作

[HttpPost]
    public ActionResult Index(HttpPostedFileBase file)
    {
        ViewBag.Text = "";
        using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(file.InputStream, false))
        {
            WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
            WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
            SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
            string text;
            foreach (Row r in sheetData.Elements<Row>())
            {
                foreach (Cell c in r.Elements<Cell>())
                {
                    text = c.CellValue.Text;
                    ViewBag.Text += text + ", ";
                }
                ViewBag.Text += "<br />";
            }
        }

        return this.View();
    }

Excel 文件

|你好 |世界 |
|世界 |你好|

输出

0, 1,
1, 0,

如您所见,0 代表“Hello”,1 代表“World”。我用更大的数据集对此进行了测试,并确认相同的单词在打印到屏幕上时具有相同的值。

该示例几乎是从 MS 网站复制/粘贴的。我尝试访问其他c.CellValue 属性,例如InnerTextInnerXml,只是为了获得相同的结果。我究竟做错了什么? Open XML 是用于此目的的好 SDK 吗?

【问题讨论】:

  • @Gandarez 这个问题使用了完全不同的库,没有回答所提出的问题。
  • 如果我在你的场景中,我会启动 Visual Studio Debugger,看看你是否能在那里找到你正在寻找的字符串

标签: c# asp.net-mvc excel razor


【解决方案1】:

使用此方法获取单元格的确切值而不是数字:

private string ReadExcelCell(Cell cell, WorkbookPart workbookPart)
{
    var cellValue = cell.CellValue;
    var text = (cellValue == null) ? cell.InnerText : cellValue.Text;
    if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
    {
        text = workbookPart.SharedStringTablePart.SharedStringTable
            .Elements<SharedStringItem>().ElementAt(
                Convert.ToInt32(cell.CellValue.Text)).InnerText;
    }

    return (text ?? string.Empty).Trim();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    相关资源
    最近更新 更多