仮説
(1) ほとんどの作業を WP8 クライアントで行う (2) ほとんどの作業をリモート サーバーで行う、という 2 つの異なるオプションがあります。
リモート サーバーを使用するオプション 2 の場合: CSV ファイルを取り込み、CSV を解析してその論理 2D テーブル構造を見つけ、ClosedXMLを使用して新しい XLSX ファイルを保存し、それをクライアントに返す WCF サービスを公開します。このオプションは最も簡単ですが、ネットワーク接続とホストされたサーバーも必要です。
オプション #1 のリモート サーバーを使用しない場合: CSV ファイルを読み取り、CSV データを XLSX ファイルにコピーし、XLSX を IsoStore に保存し、そのファイルで Excel を起動します。このトピックについて過去に書いたことがあります @ How can we create, write and read a Excel file for Windows Phone 8
非常に多くの作業を行う必要があることの 1 つは、純粋な WP7 C# で XLSX ファイルを作成することです。XLSX を記述して WP7/WP8 をサポートするサード パーティ ライブラリを変換するか、単純なエンド ツー エンドの C# コード サンプルを WP7/WP8 に変換する必要があります。どちらも単純ではありません。ClosedXML の変換は可能ですが、DocumentFormat.OpenXml の WPF の WindowsCore への依存が問題です。もう 1 つのオプションは、Chris Klugがここで Silverlight 上の Word OpenXML に対して行い、後にWP7 に移植されたように、独自の OpenXML C# 実装を作成することです。重要なのは、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 ポートを自由に改善して、その警告を削除してください。
