使用 windows phone 8 我需要能够使用 C# 在 Excel 中打开一个 CSV 文件。他们是市场上现在称为 Excel Extensions 的应用程序,可以在本地转换 csv 文件。
我已经厌倦了使用开放式办公室 XML 转换 CSV 文件,但这不起作用。我想在本地做,所以没有网络服务。
有人知道如何在 Windows Phone 8 平台上将 CSV 文件转换为 Excel 吗?
使用 windows phone 8 我需要能够使用 C# 在 Excel 中打开一个 CSV 文件。他们是市场上现在称为 Excel Extensions 的应用程序,可以在本地转换 csv 文件。
我已经厌倦了使用开放式办公室 XML 转换 CSV 文件,但这不起作用。我想在本地做,所以没有网络服务。
有人知道如何在 Windows Phone 8 平台上将 CSV 文件转换为 Excel 吗?
理论
您有两个不同的选择:(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.OpenXML和OpenXML.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 端口并删除该警告。