3

使用 windows phone 8 我需要能够使用 C# 在 Excel 中打开一个 CSV 文件。他们是市场上现在称为 Excel Extensions 的应用程序,可以在本地转换 csv 文件。

我已经厌倦了使用开放式办公室 XML 转换 CSV 文件,但这不起作用。我想在本地做,所以没有网络服务。

有人知道如何在 Windows Phone 8 平台上将 CSV 文件转换为 Excel 吗?

4

1 回答 1

5

理论

您有两个不同的选择:(1) 在 WP8 客户端上完成大部分工作 (2) 或在远程服务器上完成大部分工作。

对于使用远程服务器的选项#2:公开一个接收 CSV 文件的 WCF 服务,解析 CSV 以找到其逻辑 2D 表结构,使用ClosedXML保存新的 XLSX 文件并将其返回给客户端。此选项最直接,但也需要网络连接和托管服务器。

对于不使用远程服务器的选项#1:读取 CSV 文件,将 CSV 数据复制到 XLSX 文件中,将 XLSX 保存到 IsoStore 并使用该文件启动 excel。我过去写过关于这个主题的 文章@How can we create, write and read an excel file for Windows Phone 8

您必须做大量工作的一件事是用纯 WP7 C# 编写 XLSX 文件。您要么必须将编写 XLSX 的3rd 方 库转换为支持 WP7/WP8,要么将简单的端到端 C# 代码示例转换为 WP7/WP8。两者都不简单。转换 ClosedXML 是可能的,但 DocumentFormat.OpenXml 对 WPF 的 WindowsCore 的依赖是一个问题。另一种选择是编写自己的 OpenXML C# 实现,就像 Chris Klug在这里为 Silverlight 上的 Word OpenXML 所做的那样,后来被移植到 WP7。关键是使用 OpenXML 规范来获得优势。


实时代码示例

例如,查看 Chris Klug 的Silverlight Excel OpenXML文章,可以将他的Ag.OpenXMLOpenXML.Silverlight.Spreadsheet代码移植到 WP8,然后简单地调用它们。我就是这么做的。以下是获取该实验源代码并开始使用的方法:

1) 下载并解压 @http://JustinAngel.net/Storage/OpenXML.Silverlight.Spreadsheet.WP8.zip

2) 添加对 csproj 或“OpenXML.Silverlight.Spreadsheet.WP8\Bin\Debug”中的 DLL OpenXML.Silverlight.Spreadsheet.WP8.dll 和 SharpZipLib.dll 的引用。

3) 添加以下代码片段,将 SpreedsheetDocument 文件保存到应用程序的 WP8 IsoStore 中,然后使用 WP8 app2app 文件关联在 Word 中启动它。

private async void SaveXlsxToIsoStoreAndLaunchInExcel(SpreadsheetDocument doc)
{
    using (var isoStore = IsolatedStorageFile.GetUserStoreForApplication())
    {
        if (isoStore.FileExists("myFile.xlsx"))
            isoStore.DeleteFile("myFile.xlsx");

        using (var s = isoStore.CreateFile("myFile.xlsx"))
        using (IStreamProvider storage = new ZipStreamProvider(s))
        {
            doc.Save(storage);
        }

        Launcher.LaunchFileAsync(
            await ApplicationData.Current.LocalFolder.GetFileAsync("myFile.xlsx"));
    }
} 

4) 使用 Chris 的示例文档调用上述代码片段:

private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    SpreadsheetDocument doc = new SpreadsheetDocument();
    doc.ApplicationName = "SilverSpreadsheet";
    doc.Creator = "Chris Klug";
    doc.Company = "Intergen";

    SharedStringDefinition str1 = doc.Workbook.SharedStrings.AddString("Column 1");
    SharedStringDefinition str2 = doc.Workbook.SharedStrings.AddString("Column 2");
    SharedStringDefinition str3 = doc.Workbook.SharedStrings.AddString("Column 3");

    doc.Workbook.Sheets[0].Sheet.Rows[0].Cells[0].SetValue(str1);
    doc.Workbook.Sheets[0].Sheet.Rows[0].Cells[1].SetValue(str2);
    doc.Workbook.Sheets[0].Sheet.Rows[0].Cells[2].SetValue(str3);

    doc.Workbook.Sheets[0].Sheet.Rows[1].Cells[0].SetValue("Value 1");
    doc.Workbook.Sheets[0].Sheet.Rows[1].Cells[1].SetValue(1);
    doc.Workbook.Sheets[0].Sheet.Rows[1].Cells[2].SetValue(1001);

    doc.Workbook.Sheets[0].Sheet.Rows[2].Cells[0].SetValue("Value 2");
    doc.Workbook.Sheets[0].Sheet.Rows[2].Cells[1].SetValue(2);
    doc.Workbook.Sheets[0].Sheet.Rows[2].Cells[2].SetValue(1002);

    doc.Workbook.Sheets[0].Sheet.Rows[3].Cells[0].SetValue("Value 3");
    doc.Workbook.Sheets[0].Sheet.Rows[3].Cells[1].SetValue(3);
    doc.Workbook.Sheets[0].Sheet.Rows[3].Cells[2].SetValue(1003);

    doc.Workbook.Sheets[0].Sheet.Rows[4].Cells[0].SetValue("Value 4");
    doc.Workbook.Sheets[0].Sheet.Rows[4].Cells[1].SetValue(4);
    doc.Workbook.Sheets[0].Sheet.Rows[4].Cells[2].SetValue(1004);

    TablePart table = doc.Workbook.Sheets[0].Sheet.AddTable("My Table", "My Table", doc.Workbook.Sheets[0].Sheet.Rows[0].Cells[0], doc.Workbook.Sheets[0].Sheet.Rows[4].Cells[2]);
    table.TableColumns[0].Name = str1.String;
    table.TableColumns[1].Name = str2.String;
    table.TableColumns[2].Name = str3.String;

    doc.Workbook.Sheets[0].Sheet.AddColumnSizeDefinition(0, 2, 20);

    doc.Workbook.Sheets[0].Sheet.Rows[5].Cells[1].SetValue("Sum:");
    doc.Workbook.Sheets[0].Sheet.Rows[5].Cells[2].Formula = "SUM(" + doc.Workbook.Sheets[0].Sheet.Rows[1].Cells[2].CellName + ":" + doc.Workbook.Sheets[0].Sheet.Rows[4].Cells[2].CellName + ")";


    SaveXlsxToIsoStoreAndLaunchInExcel(doc);
}

5) 运行此代码片段时,我们可以看到以下警告弹出窗口,然后是 Excel 电子表格。随意改进我仓促的 Silverlight-->WP8 端口并删除该警告。

Excel WP8 使用我们刚刚创建的文件打开 WP8 Excel 上的损坏文件警告

于 2012-12-31T00:21:19.127 回答