ASP.NETでオープンソースコンポーネントNPOIを使用したExeclデータの迅速なインポートとエクスポート
以前はこの機能をやっていましたが、webならHttpContext.Current.Response.ContentType =”application/ms-excel”;htmlデータテーブルをexeclにエクスポートする方法の問題は、符号化フォーマットの互換性が悪すぎて、Mac OSなどのofficeで開いて直接文字化けして見せることです.あるいはofficeのCOMコンポーネントを呼び出したり、マクロスクリプトでExeclを操作したりします.この方法の主な問題は、クライアントがofficeをインストールしなければならないことです.wpsをインストールしても回転しません.
最近の製品でNPOIというオープンソースコンポーネントを使用していると、控訴方法が直接Outすぎると感じます.まずコードの魅力を感じてみましょう.
///
/// Execl
///
///
public FileResult DataExportToExecl()
{
// Excel
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1"); // sheet
var _data = CardHelper.GetAllData(); // list , ,
// sheet1
NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);
row1.CreateCell(0).SetCellValue(" ");
row1.CreateCell(1).SetCellValue("CardID");
row1.CreateCell(2).SetCellValue(" ");
row1.CreateCell(3).SetCellValue(" ");
row1.CreateCell(4).SetCellValue(" ");
row1.CreateCell(5).SetCellValue(" ");
row1.CreateCell(6).SetCellValue(" ");
// sheet1
for (int i = 0; i < _data.Count; i++)
{
NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);
rowtemp.CreateCell(0).SetCellValue(i+1);
rowtemp.CreateCell(1).SetCellValue(_data[i].ID);
rowtemp.CreateCell(2).SetCellValue(_data[i].RealName);
rowtemp.CreateCell(3).SetCellValue(_data[i].Cellphone);
rowtemp.CreateCell(4).SetCellValue(string.IsNullOrEmpty(_data[i].WorTitle) ? " " : _data[i].WorTitle);
rowtemp.CreateCell(5).SetCellValue(string.IsNullOrEmpty(_data[i].Company) ? " " : _data[i].Company);
rowtemp.CreateCell(6).SetCellValue(_data[i].CreateDate.ToString());
}
//
System.IO.MemoryStream ms = new System.IO.MemoryStream();
book.Write(ms);
ms.Seek(0, SeekOrigin.Begin);
return File(ms, "application/vnd.ms-excel", DateTime.Now.ToString("yyyyMMdd") + ".xls");
}
フロントエンドではこのアクションにハイパーテキストでリンクすればいいのですが、純粋なテキストなのかボタンなのかは、自分の好みによって決まります.
///
/// Execl
///
///
private DataView LoadExeclFile()
{
// DataTable
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Phone", typeof(string));
dt.Columns.Add("CID", typeof(string));
dt.Columns.Add("Status", typeof(string));
DataRow newRow = null;
string filepath = @"data.xls"; // Execl,
HSSFWorkbook wb = new HSSFWorkbook(new FileStream(filepath, FileMode.Open));
HSSFSheet sheet = wb.GetSheet("data") as HSSFSheet; // execl data sheet
if (sheet == null)
{
MessageBox.Show(" !");
}
else
{
//
for (int i = 1; i <= sheet.LastRowNum; i++) //
{
IRow row = sheet.GetRow(i); //
if (row != null)
{
newRow = dt.NewRow();
newRow["Name"] = row.GetCell(0).ToString();
newRow["Phone"] = row.GetCell(1).ToString();
newRow["CID"] = row.GetCell(2).ToString();
newRow["Status"] = row.GetCell(3).ToString();
if (IsMobile(row.GetCell(1).ToString()))
{
dt.Rows.Add(newRow);
}
}
}
}
return dt.DefaultView;
}
このExeclインポート機能は、Gridviewにデータをインポートすることを実現しています.データベースや他のデータストレージメディアにインポートしたい場合は、コードを次のように変更します.
///
/// Execl
///
///
private void LoadExeclFile()
{
string filepath = @"data.xls"; // Execl,
HSSFWorkbook wb = new HSSFWorkbook(new FileStream(filepath, FileMode.Open));
HSSFSheet sheet = wb.GetSheet("data") as HSSFSheet; // execl data sheet
if (sheet != null)
{
//
for (int i = 1; i <= sheet.LastRowNum; i++) //
{
IRow row = sheet.GetRow(i); //
if (row != null)
{
InsertDataIntoDB(row.GetCell(0).ToString(),row.GetCell(1).ToString(),row.GetCell(2).ToString(),row.GetCell(3).ToString());
}
}
}
}
コードを見た後、NPOIのExecl操作の強さを感じることができると信じています.もう言葉では言い表せません.控訴の導入は通常開発で最も頻繁に使用されるExecl操作であるべきであり、NPOIは基本的に様々な方法を極致にカプセル化しており、特別なビジネスシーンがない限り、少し修正すれば、自分の異なるビジネスニーズを満たすことができます.もちろん、控訴案にはいくつかの問題があり、解決の構想はほぼ類似しており、時間が空間を変えたり、空間が時間を変えたりしています.例:
�Cエクスポートデータ量が多い场合、データ取得やデータ加工処理において、性能に问题がある场合が多く、深刻な场合はメモリオーバーフロー、プログラムエラーが発生する场合もあります.解決の構想はとても簡単で、コードは改造して、ページを分けてデータを取得して、複数のsheetにエクスポートしてあるいは複数のexeclに分けてエクスポートして、コードは私は書くのがおっくうです.
NPOIのメリットとデメリットをまとめてみましょう.
長所:超シンプルで、シロも見られるのがわかります.独立したコンポーネント、参照できます.サードパーティ依存は必要ありません.符号化は柔軟に制御され、互換性に優れている.性能が非常に優れていて、ソースコードもとてもきれいです...
短所:あったら教えてください!