我尝试过使用Open Office XML转换CSV文件,但没有成功。并且我希望在本地进行转换,不使用Web服务。
有人知道如何在Windows Phone 8平台上将CSV文件转换为Excel吗?
理论
你有两个不同的选择:(1)在WP8客户端上完成大部分工作(2)或在远程服务器上完成大部分工作。
对于使用远程服务器的选项#2:公开一个WCF服务,接收CSV文件,解析CSV以找到其逻辑2D表结构,使用ClosedXML保存一个新的XLSX文件并将其返回给客户端。这个选项是最直接的,但也需要网络连接和托管服务器。
对于不使用远程服务器的选项#1:读取CSV文件,将CSV数据复制到XLSX文件中,将XLSX保存到IsoStore并启动excel打开该文件。我曾经在如何为Windows Phone 8创建、写入和读取Excel文件中写过这个主题。
你需要做的一件事情是在纯WP7 C#中编写XLSX文件,这将需要相当多的工作量。你要么需要转换第三方 库来支持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”中添加对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端口,并删除该警告。