2014年8月10日 星期日

【XML】將資料匯出到EXCEL - 透過ClosedXML套件


最近有寫Excel報表的需求,ClosedXML真的是個不錯的套件

 var workbook = new XLWorkbook(); //new Excel
 var sheet_A = workbook.Worksheets.Add("Sheet_A"); //新增Sheet到 Excel
 
 //塞資料到Sheet中
 worksheet.Cell(_index, 1).Value = "欄位一";
 worksheet.Cell(_index, 2).Value = "欄位二";
 worksheet.Cell(_index, 3).Value = "欄位三";
 worksheet.Cell(_index, 4).Value = "欄位四";
 worksheet.Cell(_index, 5).Value = "欄位五";

用法還滿簡單的,如果有更深入的用法想瞭解也可以到ClosedXml網站看文件
在使用的過程有遇到一個情況就是從DB裡面撈出大量的資料倒入Excel時,匯出打開檔案會顯示Excel已經損毀,可是直接把DB撈出來的資料用複製貼上卻可以完整地貼到Excel中,存檔再打開也不會壞掉。這個問題搞了好久...最後查到大陸網站得到以下的解答
/// 
/// 提示错误,错误信息如下: 十六进制值 0x0B 是无效的字符错误
///产生原因是xml文件中包含低位非打印字符造成的
///处理方法:在产生xml文件的时候,过滤低位非打印字符
/// 
/// 
/// 
public static string ReplaceLowOrderASCIICharacters(string tmp)
{
   StringBuilder info = new StringBuilder();
   foreach (char cc in tmp)
   {
      int ss = (int)cc;
      if (((ss >= 0) && (ss <= 8)) || ((ss >= 11) && (ss <= 12)) || ((ss >= 14) && (ss <= 32)))
         info.AppendFormat(" ", ss);//&#x{0:X};
      else info.Append(cc);
   }
   return info.ToString();
}

把字元丟到這個function去過濾後就可以避免錯誤了!!