国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

基于NPOI導出Excel

2019-11-17 02:52:23
字體:
來源:轉載
供稿:網友

基于NPOI導出Excel

2014-09-22 16:56 by 謝中淶, ... 閱讀, ... 評論, 收藏, 編輯

在上一篇文章[關于大數據的查詢與導出]中,提到了使用NPOI組件導出Excel,本想上次一起分享給大家,無奈最近比較忙,今天抽空整理了下,分享出來.

  1. 預置填充模板,并且需要支持公式計算;
  2. 可導入圖片;
  3. 可以追加數據形式填充表格.
  1. 簡單分一下這個功能.
    1. 需要處理模板的讀取,并根據模板中指定特定適配符替換模板中的數據,需要處理三種類型的單元格的格式化:散列單元格,圖片單元格,數據明細區單元格;
    2. 散列單元格: 需要定義具體的模板字符串,及期望格式化后的數據,姑且將這里處理散列單元格的對象 命名為 DispersedCellFormater;
    3. 圖片的導出,需要指定需要導出Excel 中的具體位置及期望填充的圖片資源,姑且將這里才處理圖片單元格的對象命名為 ImageCellFormater;
    4. 明細區單元格格式化,需要制定當前的列索引及每個列的這個取值函數.姑且這里將處理對象命名為DetailCellValueFormater<T>,因為了便于使用,我們引入了泛型類型;
    5. 外部調用,統一從一個入口處理,這里暫且命名為 ExportFormater;
    6. 至于散列單元格的位置,我們采用系統內置的 Point 類型來描述,明細區的取值函數使用系統定義的Func<T,object> 來描述,這里的輸入類型T即為當前行數據對象;
  2. 根據以上分析,我們簡單畫一下這個功能的UML圖,以方便理解. image
  3. 有了以上分析,實現似乎就是水到渠成的事情了.
    1. 我們擬定一個接口,用于約束導出操作.
      /// <summary>/// 導出接口/// </summary>public interface IExport{    /// <summary>    /// 導出數據,基于模板文件處理替換后,保存為一個新文件    /// </summary>    /// <param name="templateFile">模板文件</param>    /// <param name="targetFile">目標文件</param>    /// <param name="fromater">模板格式化處理規則</param>    void Export(string templateFile, string targetFile, ExportFormater fromater);    /// <summary>    /// 導出數據,基于模板文件處理替換后,保存為一個新文件    /// </summary>    /// <typeparam name="T">數據源類型</typeparam>    /// <param name="templateFile">模板文件</param>    /// <param name="targetFile">目標文件</param>    /// <param name="formater">模板格式化處理規則</param>    /// <param name="source">數據源</param>    void Export<T>(string templateFile, string targetFile,        ExportFormater<T> formater, IList<T> source) where T : class;    /// <summary>    /// 以追加的形式,將數據添加到已存在的文件中    /// </summary>    /// <typeparam name="T">數據源類型</typeparam>    /// <param name="targetFile">目標文件</param>    /// <param name="formater">模板格式化處理規則</param>    /// <param name="source">數據源</param>    void ExportByAppend<T>(string targetFile, ExportFormater<T> formater,        IList<T> source) where T : class;}
    2. 散列單元格格式處理器
      /// <summary> /// 散列單元格數據格式器 /// </summary> public class DispersedCellFormater {     /// <summary>     /// 單元格坐標     /// </summary>     public Point CellPoint { get; set; }     /// <summary>     /// 格式化字符串     /// </summary>     public string FormaterString { get; set; }     /// <summary>     /// 格式化數據     /// </summary>     public object CellValue { get; set; }     /// <summary>     /// 實例化     /// </summary>     public DispersedCellFormater()     {     }     /// <summary>     /// 實例化     /// </summary>     /// <param name="x">cell 橫坐標</param>     /// <param name="y">cell 縱坐標</param>     /// <param name="formatStr">格式化字符串</param>     /// <param name="val">替換值</param>     public DispersedCellFormater(int x, int y, string formatStr, object val)        {            this.CellPoint = new Point(x, y);            this.FormaterString = formatStr;            this.CellValue = val;        } }
    3. 圖片單元格格式處理器
      /// <summary> /// 圖片Cell格式化器 /// </summary> public class ImageCellFormater {     /// <summary>     /// 單元格位置     /// </summary>     public Point CellPoint { get; set; }     /// <summary>     /// 顯示圖片     /// </summary>     public Image Img { get; set; }     /// <summary>     /// 實例化     /// </summary>     public ImageCellFormater()        {        }     /// <summary>     /// 實例化     /// </summary>     /// <param name="x">cell橫坐標</param>     /// <param name="y">cell縱坐標</param>     /// <param name="img">圖片</param>     public ImageCellFormater(int x, int y, Image img)     {         this.CellPoint = new Point(x, y);         this.Img = img;     } }
    4. 明細區單元格格式處理器
      /// <summary>/// 明細單元格取值規則/// <typeparam name="T">數據類型</typeparam>/// </summary>public class DetailCellValueFormater<T> where T : class{    /// <summary>    /// 列索引    /// </summary>    public int Index { get; set; }    /// <summary>    /// 取值函數    /// </summary>    public Func<T, object> Value { get; set; }    /// <summary>    /// 實例化    /// </summary>    public DetailCellValueFormater()    {    }    /// <summary>    /// 實例化    /// </summary>    /// <param name="index">列索引</param>    /// <param name="val">數據</param>    public DetailCellValueFormater(int index, Func<T, object> val)    {        this.Index = index;        this.Value = val;    }}
    5. 接下來一起看下導出格式處理集合的定義.
      /// <summary>/// 用于描述導出格式化數據/// </summary>public class ExportFormater{    /// <summary>    /// 散列單元格替換規格    /// </summary>    public List<DispersedCellFormater> DispersedCellFormaters { get; PRivate set; }    /// <summary>    /// 圖片單元格格式化規則    /// </summary>    public List<ImageCellFormater> ImageCellFormaters { get; private set; }    /// <summary>    /// 明細數據起始行索引    /// </summary>    public int DetailRowBeginIndex { get; set; }    /// <summary>    /// 實例化    /// </summary>    public ExportFormater()    {        DispersedCellFormaters = new List<DispersedCellFormater>();        ImageCellFormaters = new List<ImageCellFormater>();    }}/// <summary>/// 用于描述導出格式化數據,帶有明細區數據取值規則/// </summary>public class ExportFormater<T> : ExportFormater where T : class{    /// <summary>    /// 明細區取值函數    /// </summary>    public List<DetailCellValueFormater<T>> DetailCellValueFormaters { get; private set; }    /// <summary>    /// 實例化    /// </summary>    public ExportFormater()    {        DetailCellValueFormaters = new List<DetailCellValueFormater<T>>();    }}
    6. 接下來我們簡單看下導出的具體實現.
      1. 散列單元格的處理
        /// <summary>/// 應用散列單元格格式/// </summary>/// <param name="formater">格式化規則</param>/// <param name="sheet">當前sheet</param>private static void ApplyDispersedCell(ExportFormater formater, HSSFSheet sheet){    if (formater.DispersedCellFormaters != null && formater.DispersedCellFormaters.Count > 0)    {        formater.DispersedCellFormaters.ForEach(r =>        {            var tempRow = sheet.GetRow(r.CellPoint.X);            var tempCell = tempRow.GetCell(r.CellPoint.Y);            var txt = tempCell.StringCellValue;            if (string.IsNullOrWhiteSpace(txt))            {                tempCell.SetCellValue(Convert.ToString(r.CellValue));            }            else            {                //替換模板                tempCell.SetCellValue(txt.Replace(r.FormaterString, Convert.ToString(r.CellValue)));            }        });    }}
      2. 圖片單元格的處理
        /// <summary> /// 應用圖片單元格 /// </summary> /// <param name="formater">格式化處理器</param> /// <param name="workbook"></param> /// <param name="sheet"></param> private static void ApplyImgCell(ExportFormater formater,     HSSFWorkbook workbook, HSSFSheet sheet) {     if (formater.ImageCellFormaters.Count <= 0)     {         return;     }     var patriarch = sheet.CreateDrawingPatriarch();     formater.ImageCellFormaters.ForEach(t =>     {         if (t.Img != null)         {             var imgData = t.Img.ToByte();             //- 圖片輸出的位置這么計算的:             //- 假設我們要將圖片放置于第 5(E) 列的第 2 行              //- 對應索引為是 4 : 1 (默認位置)             //- 放置的位置就等于(默認位置)到(默認位置各自加上一行、一列)             var imgPath = new HSSFClientAnchor(                1, 1,              //- 上左 到 上右 的位置,是基于下面的行列位置
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新巴尔虎左旗| 阳城县| 涞源县| 涟源市| 望城县| 麟游县| 葫芦岛市| 长子县| 太湖县| 西畴县| 澄江县| 会宁县| 望都县| 镇原县| 江华| 石家庄市| 武川县| 左贡县| 桃江县| 沂水县| 辉南县| 南开区| 潼南县| 湖北省| 齐齐哈尔市| 沂南县| 卓尼县| 靖安县| 崇信县| 石楼县| 浮梁县| 南木林县| 永泰县| 神木县| 镇赉县| 塘沽区| 宜君县| 蓝山县| 宜丰县| 河北省| 凭祥市|