您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用C#将DataTable导出到文件

寒冰屋 发布时间:2020-04-23 21:25:21 ,浏览量:0

目录

背景

助手类

创建纯文件内容的扩展方法

创建Excel文件对象的扩展方法

文件助手

使用代码

创建普通文件

创建Excel文件

解决方案和项目

局限性

下一步是什么?

  • 下载Vs2015_DatatableToFile-9.2 KB
背景

导出的文件类型是什么?

  • 带分隔符的纯文本文件(扩展名为.csv,.txt,.gm等)
  • Excel文件(.xls,.xlsx)
助手类 创建纯文件内容的扩展方法

使用此扩展名,我们将能够创建普通的文件内容作为一个string,考虑到一个输入DataTable。

扩展方法还具有以下选项:

  • 设置分隔符
  • 包括列名作为文件标题行
  • 处理具有默认值的null值列
  • 必要时修剪列值
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;

public static class DataTableHelper
{
    public static string DataTableToFileContent(this DataTable datatable, 
                  string seperator = ",", bool inchuleColumnName = true, 
                  string defaultNullColumnValue = "", bool trimColumValue = true)
    {
        /*https://stackoverflow.com/a/28503521 */

        if (defaultNullColumnValue == null)
        {
            throw new NullReferenceException("'defaultNullColumnValue' should not be null");
        }
        StringBuilder sb = new StringBuilder();
        
        /*header*/
        if (inchuleColumnName)
        {
            for (int i = 0; i < datatable.Columns.Count; i++)
            {
                sb.Append(datatable.Columns[i]);
                if (i < datatable.Columns.Count - 1)
                {
                    sb.Append(seperator);
                }
            }
            sb.AppendLine();
        }

        /*data*/
        long lineNo = 0;
        string value;
        foreach (DataRow row in datatable.Rows)
        {
            lineNo++;
            if (lineNo > 1)
            {
                sb.AppendLine();
            }
            for (int i = 0; i < datatable.Columns.Count; i++)
            {
                var columnValue = row[i];
                value = columnValue == DBNull.Value ? 
                        defaultNullColumnValue : columnValue.ToString();
                if (trimColumValue)
                {
                    value = value.Trim();
                }
                sb.Append(value);
                if (i < datatable.Columns.Count - 1)
                {
                    sb.Append(seperator);
                }
            }
        }
        return sb.ToString();
    }
}
创建Excel文件对象的扩展方法

要创建Excel文件内容,我们使用EPPlus。这是一个很棒的库,具有许多很棒的功能和选项。不幸的是,它从版本5开始不再是免费版本,我们使用的是较低版本的4.5.3.3。

扩展方法还具有以下选项:

  • 设置sheet名称
  • 包括列名称作为标题,并自动过滤到标题行
  • 处理具有默认值的null值列
  • 必要时修剪列值
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;

public static class DataTableHelper
{
    private static string GetExcelColumnName(int columnNumber)
    {
        /*
        1 equal A
        https://stackoverflow.com/questions/181596/
        how-to-convert-a-column-number-e-g-127-into-an-excel-column-e-g-aa
        */
        int dividend = columnNumber;
        string columnName = String.Empty;
        int modulo;

        while (dividend > 0)
        {
            modulo = (dividend - 1) % 26;
            columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
            dividend = (int)((dividend - modulo) / 26);
        }

        return columnName;
    }

    public static ExcelPackage DataTableToExcel(this DataTable datatable, 
    string sheetName = "Sheet1",  bool inchuleColumnName = true, 
    string defaultNullColumnValue = null, bool trimColumValue = true)
    {
        if (String.IsNullOrEmpty(sheetName))
        {
            throw new NullReferenceException("'sheetName' should not be null or empty");
        }
        
        sheetName = sheetName.Trim();
        ExcelPackage excel = new ExcelPackage();
        var workSheet = excel.Workbook.Worksheets.Add(sheetName);
        int columnCount = datatable.Columns.Count;
        int lineNo = 1;

        /*header*/
        if (inchuleColumnName)
        {
            int headerNumber = 1;
            foreach (DataColumn column in datatable.Columns)
            {
                workSheet.Cells[lineNo, headerNumber].Value = column.ColumnName;
                headerNumber++;
            }
            workSheet.Row(lineNo).Style.Font.Bold = true;
            /*add filter to header*/
            workSheet.Cells[String.Format("{0}{1}:{2}{3}", GetExcelColumnName(1), 
            lineNo, GetExcelColumnName(columnCount), lineNo)].AutoFilter = true;
            lineNo++;
        }

        /*data*/
        string value;
        foreach (DataRow row in datatable.Rows)
        {
            for (int i = 0; i < columnCount; i++)
            {
                var columnValue = row[i];
                value = columnValue == DBNull.Value ? 
                        defaultNullColumnValue : columnValue.ToString();
                if (trimColumValue && value != null)
                {
                    value = value.Trim();
                }
                int columnNo = i + 1;
                /*https://stackoverflow.com/a/36824090*/
                workSheet.Cells[lineNo, columnNo].Value = 
                                string.IsNullOrEmpty(value) ? null : value;
            }
            lineNo++;
        }

        for (int i = 1; i             
关注
打赏
1665926880
查看更多评论
0.0499s