ASP.NETでオープンソースコンポーネントNPOIを使用したExeclデータの迅速なインポートとエクスポート

5991 ワード

多くの子供靴がExeclのインポート・エクスポート機能を開発していると信じられています.最近の製品では、バックグラウンド・データ分析の必要性にかかわらず、フロントエンドがユーザー管理の便利さを満たすためにも、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のメリットとデメリットをまとめてみましょう.
長所:超シンプルで、シロも見られるのがわかります.独立したコンポーネント、参照できます.サードパーティ依存は必要ありません.符号化は柔軟に制御され、互換性に優れている.性能が非常に優れていて、ソースコードもとてもきれいです...
短所:あったら教えてください!