在 Windows Phone 8 中以编程方式(逐个单元格)读取/导入现有 Excel 文件

2024-01-11

我正在开发一个 Windows Phone 8 应用程序来读取/写入 Excel 文件。我问了一个question https://stackoverflow.com/questions/20761974/how-to-read-write-xls-docs-and-csv-file-in-windows-phone-8-application这里关于这个和提供的评论以及许多其他链接引导我OpenXml https://stackoverflow.com/questions/13702643/how-can-we-create-write-and-read-an-excel-file-for-windows-phone-8.

所有这些让我很好地了解了如何createExcel 文件以及如何启动它。但现在我陷入了这些非常基本的问题,即如何read一个现有的 Excel 文件(可能在外部使用 MS Excel 创建)逐个单元格,即我想通过我的代码访问每个单元格及其值。在 openXML 中我这样做了:

Stream localFile = App.GetResourceStream(new Uri("/ReadExcel;component/jai.xlsx"
                                                    ,UriKind.Relative)).Stream;
MemoryStream ms = new MemoryStream();
localFile.CopyTo(ms);

DocumentFormat.OpenXml.Packaging.SpreadsheetDocument spreadsheetDoc =
DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open(localFile, true);
{
    var a = spreadsheetDoc.Package;
    // Do work here
}

但它给了我错误:

The type 'System.IO.Packaging.Package' is defined in an assembly that is not 
referenced. You must add a reference to assembly 'WindowsBase, Version=4.0.0.0

所以基本上我被困在这个WindowsBase.dll。我尝试了各种方法来导入程序集,即解锁和所有方法,但没有任何效果。

因此,我想要做的就是以编程方式逐个单元格地访问代码中现有 Excel 文件的内容。

请帮助或建议目前在 WP8 中是否可能。


我使用以下方法从 Windows Phone 8 上的 xlsx Excel 文件中读取单元格:

  1. Add the 微软压缩库 https://www.nuget.org/packages/microsoft.bcl.compression使用 NuGet 到您的项目
  2. 改编代码示例开发者网络 http://social.msdn.microsoft.com/Forums/en-US/4fce4765-2d05-4a2b-8d0a-6219e87f3307/reading-excel-file-using-c-in-winrt-platform满足您的需求 - 它展示了如何从 Excel 文件读取单元格(并且需要压缩库)

因为我已经对代码进行了一些扩展来处理空列 and 空文件正确地你也可以使用我的代码:

public class ExcelReader
{
    List<string> _sharedStrings;

    List<Dictionary<string, string>> _derivedData;

    public List<Dictionary<string, string>> DerivedData
    {
        get
        {
            return _derivedData;
        }
    }
    List<string> _header;

    public List<string> Headers { get { return _header; } }

    // e.g. cellID = H2 - only works with up to 26 cells
    private int GetColumnIndex(string cellID)
    {
        return cellID[0] - 'A';
    }

    public void StartReadFile(Stream input)
    {
        ZipArchive z = new ZipArchive(input, ZipArchiveMode.Read);
        var worksheet = z.GetEntry("xl/worksheets/sheet1.xml");
        var sharedString = z.GetEntry("xl/sharedStrings.xml");

        // get shared string
        _sharedStrings = new List<string>();
        // if there is no content the sharedStrings will be null
        if (sharedString != null)
        {
            using (var sr = sharedString.Open())
            {
                XDocument xdoc = XDocument.Load(sr);
                _sharedStrings =
                    (
                    from e in xdoc.Root.Elements()
                    select e.Elements().First().Value
                    ).ToList();
            }
        }

        // get header
        using (var sr = worksheet.Open())
        {
            XDocument xdoc = XDocument.Load(sr);
            // get element to first sheet data
            XNamespace xmlns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
            XElement sheetData = xdoc.Root.Element(xmlns + "sheetData");

            _header = new List<string>();
            _derivedData = new List<Dictionary<string, string>>();

            // worksheet empty?
            if (!sheetData.Elements().Any())
                return;
            // build header first
            var firstRow = sheetData.Elements().First();
            // full of c
            foreach (var c in firstRow.Elements())
            {
                // the c element, if have attribute t, will need to consult sharedStrings
                string val = c.Elements().First().Value;
                if (c.Attribute("t") != null)
                {
                    _header.Add(_sharedStrings[Convert.ToInt32(val)]);
                } else
                {
                    _header.Add(val);
                }

            }

            // build content now
            foreach (var row in sheetData.Elements())
            {
                // skip row 1
                if (row.Attribute("r").Value == "1")
                    continue;
                Dictionary<string, string> rowData = new Dictionary<string, string>();
                // the "c" elements each represent a column
                foreach (var c in row.Elements())
                {
                    var cellID = c.Attribute("r").Value; // e.g. H2

                    // each "c" element has a "v" element representing the value
                    string val = c.Elements().First().Value;
                    // a string? look up in shared string file
                    if (c.Attribute("t") != null)
                    {
                        rowData.Add(_header[GetColumnIndex(cellID)], _sharedStrings[Convert.ToInt32(val)]);
                    } else
                    {
                        // number
                        rowData.Add(_header[GetColumnIndex(cellID)], val);
                    }
                }
                _derivedData.Add(rowData);
            }
        }
    }
}

这适用于具有一张工作表以及一些文本和数字单元格的简单 Excel 文件。它假设有一个标题行。

用法如下:

var excelReader = new ExcelReader();
excelReader.StartReadFile(excelStream);

看完之后excelReader.Headers包含标题名称,excelReader.DerivedData包含行。每行是一个Dictionary将标头作为键,将数据作为值。空单元格不会在那里。

希望这能让你开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Windows Phone 8 中以编程方式(逐个单元格)读取/导入现有 Excel 文件 的相关文章

  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 结构体如何存储在内存中?

    我有一个struct iof header在我的代码中 我确定它的宽度是 24 字节 我执行 sizeof iof header 它返回 32 字节宽 问题1为什么是 32 字节宽而不是 24 字节宽 问题2包括其成员在内 结构体如何存储在
  • .NET 单点登录

    我一直在尝试使用 C 为 NET Web 应用程序实现 WEB SSO 服务提供程序插件 我将使用 shibboleth 身份提供商 我已经使用 OpenSAML 库为 java 应用程序实现了相同的功能 我想知道在 NET 应用程序中使用
  • fopen_s 怎么会比 fopen 更安全呢?

    我正在处理遗留代码Windows平台 当我编译代码时VS2013 它给出以下警告 错误 C4996 fopen 该函数或变量可能不安全 考虑使用fopen s反而 要禁用弃用 请使用 CRT SECURE NO WARNINGS 详情请参见
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • 嵌入资源文件的路径

    我的资源文件中有一个图标 我想引用它 这是需要图标文件路径的代码 IWshRuntimeLibrary IWshShortcut MyShortcut MyShortcut IWshRuntimeLibrary IWshShortcut W
  • ASP.NET - 在 RenderContent 调用中将事件处理程序添加到 Repeater 内的 LinkBut​​ton

    我有一个加载自定义用户控件的 Sharepoint WebPart 用户控件包含一个 Repeater 而 Repeater 又包含多个 LinkBut ton 在 Web 部件的 RenderContent 调用中 我有一些用于添加事件处
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • 传递数组时在 C 中的函数参数中强制指定数组大小

    Context 在 C 中 我有一个以数组作为参数的函数 该参数用作该函数的输出 输出的大小始终相同 我会 让阅读代码的人清楚所需的大小 不过它已经在函数注释中了 理想情况下 编译会输出警告或错误 这样我就可以在编译时而不是运行时防止出现问
  • Type.GetInterfaces() 仅适用于声明的接口

    首先 像这样的问题有很多 也许有些OP甚至在问同样的问题 问题是这些问题的答案 无论是否接受 都没有真正回答这个问题 至少我找不到 如何确定类直接声明的接口 而不是由父级或声明的接口继承的接口 e g interface I interfa
  • C++ 中是否有与 PHP 的explode() 函数等效的函数? [复制]

    这个问题在这里已经有答案了 可能的重复 在 C 中分割字符串 https stackoverflow com questions 236129 splitting a string in c 在 PHP 中 explode 函数将获取一个字
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 如何在 C 中创建最低有效位设置为 1 的掩码

    这个功能如何运作 最低有效 n 位设置为 1 的掩码 Example n 6 gt 0x2F n 17 gt 0x1FFFF 我根本不明白这些 尤其是 n 6 gt 0x2F 另外 什么是面膜 通常的方法是采取1 并将其左移n位 这会给你类
  • 使用 CodeDOM 将程序集添加到 BuildManager 会导致间歇性错误

    我正在使用 CodeDOM 在运行时创建内存中程序集 如下所示 public Assembly Compile CodeCompileUnit targetUnit string path Path GetDirectoryName new
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找

随机推荐