スポンサードリンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサードリンク



スポンサードリンク

GridViewをエクセル(xlsx)出力

エクセルをxlsx形式で扱いたい為に以下を試してみた。
Visual Studio 2010


エクセルを扱う便利パッケージは色々とあるが、代表的なClosedXMLとEPPlusを試してみる。
結果的に以下の理由でEPPlusを使うことにした。

理由1:古いデータベースからデータ読み込んだ時に、文字コードの関連で文字化けしているデータが存在したが、これを扱うとClosedXMLでは例外発生
理由2:ブランクがnbsp;で表示され、変換が必要だった。

「2」の理由は対したことないが「1」の理由が大きいかな。


--

<準備>

①Excelを扱う為に基本となるOpenXMLをインストール。開発環境にも実行サーバ上にも。

OpenXMLSDKToolV25.msi
OpenXMLSDKV25.msi

OpenXMLSDKV25だけでよいが、OpenXMLSDKToolV25には色々と便利なToolが入ってるらしいが未検証。

以下からダウンロード
https://www.microsoft.com/en-us/download/details.aspx?id=30425

②NuGetでインストールすると簡単なので、VisualStudio最初にこれをセットアップ

以下からダウンロードしてNuGet.Tools.vsixを実行する。

https://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c

インストール後、VisualStudioを再起動すれば、ツールにNuGetパッケージマネージャが現れる

--


①ClosedXMLを利用する場合

[ツール]-[NuGetパッケージマネージャ]-[ソリューションのNuGetパッケージの管理]
右上の検索ウインドウで[ClosedXML]で検索し、表示されたパッケージの[インストール]ボタンをクリック

準備完了なので、早速実行する。

画面にGridViewとボタンを配置して、ボタンクリックで以下を実行すると出力されます。
GridViewには適当にデータを読み込ませてみてください。

using System.Data;
using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.Table;

protected void Button1_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable("GridView_Data");
foreach (TableCell cell in GridView1.HeaderRow.Cells)
{
dt.Columns.Add(cell.Text);
}
foreach (GridViewRow row in GridView1.Rows)
{
dt.Rows.Add();
for (int i = 0; i < row.Cells.Count; i++)
{
//ブランクが で表示されるので変換する。
dt.Rows[dt.Rows.Count - 1][i] = (row.Cells[i].Text == " ") ? "" : row.Cells[i].Text;

}
}
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(dt);

Response.Clear();
Response.Buffer = true;
Response.Charset = "";
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=GVOUTPUT.xlsx");

using (MemoryStream MyMemoryStream = new MemoryStream())
{
wb.SaveAs(MyMemoryStream);
MyMemoryStream.WriteTo(Response.OutputStream);
Response.Flush();
Response.End();
}
}
}


②EPPlusを利用する場合

[ツール]-[NuGetパッケージマネージャ]-[ソリューションのNuGetパッケージの管理]
右上の検索ウインドウで[EPPlus]で検索し、表示されたパッケージの[インストール]ボタンをクリック

準備完了なので、早速実行する。

画面にGridViewとボタンを配置して、ボタンクリックで以下を実行すると出力されます。
GridViewには適当にデータを読み込ませてみてください。

using System.Data;
using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.Table;


protected void Button1_Click(object sender, EventArgs e)
{
string fName = DateTime.Now.ToString("yyyyMMdd_HHmm") + "_売上明細照会";

DataTable dt = new DataTable("GridView_Data");
foreach (TableCell cell in GridView1.HeaderRow.Cells)
{
dt.Columns.Add(cell.Text);
}
foreach (GridViewRow row in GridView1.Rows)
{
dt.Rows.Add();
for (int i = 0; i < row.Cells.Count; i++)
{
dt.Rows[dt.Rows.Count - 1][i] = row.Cells[i].Text;
}
}

Response.Clear();
Response.Charset = "";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AddHeader("content-disposition", "attachment;filename=GVOUTPUT.xlsx");

using (ExcelPackage pck = new ExcelPackage())
{
ExcelWorksheet wsDt = pck.Workbook.Worksheets.Add("Sheet1");
wsDt.Cells["A1"].LoadFromDataTable(dt, true, TableStyles.Medium2); //このスタイル変更で色を変えれます。
wsDt.Cells[wsDt.Dimension.Address].AutoFitColumns();

Response.BinaryWrite(pck.GetAsByteArray());
}

Response.Flush();
Response.End();
}

--
ちなみにサーバにファイル保存する場合は、以下のようにパスを指定してSaveすればよいですね。

string filePath = "C:\\test2\\sample.xlsx";

ExcelWorksheet wsDt = pck.Workbook.Worksheets.Add("Sheet1");
wsDt.Cells["A1"].LoadFromDataTable(dt, true, TableStyles.Medium2);
wsDt.Cells[wsDt.Dimension.Address].AutoFitColumns();
pck.SaveAs(new FileInfo(filePath));
スポンサードリンク


コメントの投稿

非公開コメント

メールフォーム

ShoEngineer

Author:ShoEngineer

人気ブログランキングへ
↑↑クリックお願いします!

相互リンク歓迎(^_^)
以下からご連絡を!

名前:
メール:
本文:

スポンサード リンク
楽天
検索フォーム
Lc.ツリーカテゴリー
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。