spire.xls 使用记录,List类集合导出到Excel表中

1. 新建excel表

/**新建excel*/
Workbook newBook1 = new Workbook();
newBook1.CreateEmptySheets(1);
Worksheet newSheet1 = newBook1.Worksheets[0];

2. 设置样式

/**设置样式*/
newSheet1.AllocatedRange.AutoFitColumns();//列宽自适应
newSheet1.Range[1,1,1, newSheet1.LastColumn].Style.Font.IsBold = true;//首行字体加粗
newSheet1.FreezePanes(2, 1);//首行冻结

3. List<T> 导出到Excel表中

   思路:

    1. 先将List<T> 转成DataTable数据

    2. 利用Attribute将T的属性转成DataTable的列名(不追求中文列名的可以不做)

    3. 将DataTable双循环赋值到Excel表中

    4. 按照要求更改样式,保存

/// <summary>
/// 类集合,导出到Excel,返回excel文件名
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tList">List集合</param>
/// <param name="filePath">存放文件目录</param>
/// <returns>excel文件名</returns>
public static string ListToExcel<T>(List<T> tList, string filePath) where T : class, new()
{
    //创建一个Excel文件
    try
    {
        T t = new T();
        Type type = t.GetType();
        PropertyInfo[] p_list = type.GetProperties();
        FieldInfo[] fieldInfos = type.GetFields();
        DataTable dt = new DataTable();
        if (p_list != null && p_list.Length > 0)
        {
             /**利用attribute将属性转成列名*/
            for (int i = 0; i < p_list.Length; i++)
            {
                Attribute datareaderattr = p_list[i].GetCustomAttribute(typeof(DataReaderModelAttribute), false);
                if (datareaderattr != null)
                {
                    DataReaderModelAttribute dataattr = (DataReaderModelAttribute)datareaderattr;
                    string columName = dataattr.Datareaderfieldname;
                    dt.Columns.Add(columName, Type.GetType("System.String"));
                }
            }
        }
        /**List数据转DataTable*/
        for (int j = 0; j < tList.Count; j++)
        {
            DataRow row = dt.NewRow();
            T tem = tList[j];
            Type jtype = tem.GetType();
            PropertyInfo[] j_list = type.GetProperties();
            FieldInfo[] jfieldInfos = type.GetFields();
            if (j_list != null && j_list.Length > 0)
            {
                /**利用循环将List中类的值填到dt中,一行值对应一个类*/
                foreach (var item in j_list)
                {
                    Attribute datareaderattr = item.GetCustomAttribute(typeof(DataReaderModelAttribute), false);
                    if (datareaderattr != null)
                    {
                        DataReaderModelAttribute dataattr = (DataReaderModelAttribute)datareaderattr;
                        row[dataattr.Datareaderfieldname] = item.GetValue(tem, null).ToString();
                    }
                }
                dt.Rows.Add(row);
            }
        }
        /**新建excel*/
        Workbook newBook1 = new Workbook();
        newBook1.CreateEmptySheets(1);
        Worksheet newSheet1 = newBook1.Worksheets[0];
        /**利用双循环将dt值填到excel表中*/
        for (int k = 0; k < dt.Columns.Count; k++)
        {
            newSheet1.Range[1, k + 1].Text = dt.Columns[k].ColumnName;
            for (int z = 0; z < dt.Rows.Count; z++)
            {
                newSheet1.Range[z + 2, k + 1].Text = dt.Rows[z][k].ToString();
            }
        }
        /**设置样式*/
        newSheet1.AllocatedRange.AutoFitColumns();//列宽自适应
        newSheet1.Range[1,1,1, newSheet1.LastColumn].Style.Font.IsBold = true;//首行字体加粗
        newSheet1.FreezePanes(2, 1);//首行冻结
        
         /**保存*/
        string strName = @"\Export" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
        string path = filePath + strName;
        newBook1.SaveToFile(path, ExcelVersion.Version2013);
        return strName;
    }
    catch (Exception ex)
    {
        LogTool.ExceptionLog(ex, ex.StackTrace);
        return "";
    }
}

 

posted @ 2020-01-08 11:13  Barrior  阅读(1001)  评论(1)    收藏  举报