2015年12月30日 星期三

糟糕!使用NPOI操作Excel文件當機了

NPOI是Apache License 2.0的開放原始碼函式庫,提供.NET程式開發人員在無安裝Microsoft Office的環境下,讀取和操作Office 97-2007文件。

問題說明:

當我們使用CreateSheet方法去創建一組新的工作表,如下面的程式碼:
       HSSFWorkbook Workbook;   
       Workbook = new HSSFWorkbook();
       Workbook.CreateSheet("Sheet1");
       ISheet sheet = Workbook.GetSheetAt(0);

如果使用了下面的方法讀取工作表的row或cell的資料時,
出現嚴重的Exception而無法知道原因!

例如:
                IRow row;
                row = sheet.GetRow(0);
                if (row == null)
                    row = sheet.CreateRow(0);

解決方法:
當工作表使用CreateSheet("Sheet1")方法產生時,不能使用sheet.GetRow(0)的方法,必須直接使用CreateRow(0)的方法;對於Cell的操作也是一樣,否則伺服器會完全當機!

正確的方法如下:
IRow row = sheet.CreateRow(0);
ICell cell = row.CreateCell(0);

※記住了:在NPOI元件下使用CreateSheet()方法產生的工作表,初次操作row或cell時,要直接使用CreateRow或CreateCell,不能習慣性地先讀取row或cell再判斷是否為nll的方式!

2015年9月28日 星期一

實作動態加入AsyncFileUpload Control

●問題描述:
開發ASP.NET網站系統最常使用的檔案上傳元件為:AJAX Control Tool Kit的AsyncFileUpload Control,當實作頁面時可能遇到多資料列需要分別上傳檔案的情況

如果直接在頁面上嵌入很多的AsyncFileUpload Control,並不是王道的作法;本文試著將動態實作多個AsyncFileUpload Control的重點,說明如下:

一、UI頁面布置程式碼:
加入一組 Panel Control 即可

二、動態產生資料頁面如下:
 
三、實作『上傳檔案』按鈕的Click 或Command事件

protected void bu_Command(object sender, CommandEventArgs e)
 {
        Button bu = (Button)sender;
        string id = bu.ID.TrimStart(new char[] { 'b', 'u' });
        uploadHF.Value = id;
        Panel1.Controls.Clear();
        ScriptManager.RegisterStartupScript(Page, Page.GetType(), "reroll", "__doPostBack();", true);

}

四、實作Post Back 後Page Load 動態加入AsyncFileUpload Control

if (string.IsNullOrEmpty(uploadHF.Value) == false)
{

  string id = uploadHF.Value;
  string fid = string.Format("up_{0}", id
);//上傳檔案按鈕的容器ID
  AsyncFileUpload afu = new AsyncFileUpload();
  afu.Width = Unit.Percentage(60);
  afu.ID = "afu" + id;
  afu.UploadedComplete += AsyncFileUpload1_UploadedComplete;
  afu.UploadedFileError += AsyncFileUpload1_UploadedFileError;
  afu.OnClientUploadComplete = "UploadComplete";
  //afu.ThrobberID = im.ID;
  Page.Master.FindControl("ContentPlaceHolder1").FindControl("Panel1").FindControl (fid).Controls.Add(afu);

}

補充說明:此區塊還需要實作
1、AsyncFileUpload1_UploadedComplete
2、AsyncFileUpload1_UploadedFileError
3、UI頁面上的UploadComplete
以上的實作程式碼網路上很多範例這裡不再臚列。

五、完成頁面點選『上傳檔案』示例














※實作重點:必須在Page_Load事件中動態加入AsyncFileUpload Control