C# DataTable表格导出CSV文件

1.添加DLL 

using NPOI.XSSF.Streaming;
using NPOI.XSSF.UserModel;

using NPOI.SS.UserModel;
using System.Collections.Generic;
using System.Data;
using System.IO;

 /// <summary>
        /// 
        /// </summary>
        /// <param name="excelDatas">导出表格的数据</param>
        /// <param name="dic">导出表格表头的名字  key:插入的</param>
        /// <param name="exportPath">导出路径</param>
        /// <param name="sheetName">表名</param>
        public static void Export(DataTable excelDatas, Dictionary<string, string> dic, string exportPath, string sheetName = "Sheet1")
        {
           
            //添加列名
            HashSet<string> hashSet = new HashSet<string>();
            foreach (DataColumn column in excelDatas.Columns)
            {
                hashSet.Add(column.ColumnName);
            }

            IEnumerable<string> keys = dic.Keys.Intersect(hashSet);
            Dictionary<string, string> dictionary = dic.Where((KeyValuePair<string, string> p) => keys.Contains(p.Key)).ToDictionary((KeyValuePair<string, string> p) => p.Key, (KeyValuePair<string, string> p) => p.Value);

            //行数
            int rowNum = 0;
            //列数
            int cloumNum = 0;
            //工作簿
            IWorkbook workBook = (IWorkbook)(object)new XSSFWorkbook();
            //创建表
            ISheet createSheet = workBook.CreateSheet(sheetName);
            //创建行
            IRow createRow = createSheet.CreateRow(rowNum);
            foreach (KeyValuePair<string, string> item in dictionary)
            {
                //创建单元格
                ICell createCell = createRow.CreateCell(cloumNum);
                createCell.SetCellValue(item.Value);
                cloumNum++;
            }

            rowNum++;
            foreach (DataRow row in excelDatas.Rows)
            {
                createRow = createSheet.CreateRow(rowNum);
                cloumNum = 0;
                foreach (KeyValuePair<string, string> item in dictionary)
                {
                    object obj = row[item.Key];
                    DataColumn dataColumn2 = excelDatas.Columns[item.Key];
                    ICell cell = createRow.CreateCell(cloumNum);
                    SetCellValue(cell, obj, dataColumn2.DataType);
                    cloumNum++;
                }

                rowNum++;
            }

            AdjustColumnWidth(createSheet, dictionary.Count);
            Export(workBook, exportPath);
        }
        private static void Export(IWorkbook workbook, string exportPath)
        {
            try
            {
                FileStream fileStream = null;
                FileInfo fileInfo = new FileInfo(exportPath);
                string directoryName = fileInfo.DirectoryName;
                if (!Directory.Exists(directoryName))
                {
                    Directory.CreateDirectory(directoryName);
                }
                try
                {
                    fileStream = new FileStream(exportPath, FileMode.Open, FileAccess.Write, FileShare.Write, bufferSize: 4096, useAsync: true);
                    workbook.Write(fileStream);
                    workbook.Close();
                }
                finally
                {
                    if (fileStream != null)
                    {
                        fileStream.Close();
                        fileStream.Dispose();
                    }
                }
             
            }
            catch (Exception ex)
            {
                LogHelper.Proxy.Error(ex);
            }
            finally
            {
              
            }
        }

        /// <summary>
        /// 调整列的宽度
        /// </summary>
        /// <param name="sheet">表名</param>
        /// <param name="maxColumn"></param>
        private static void AdjustColumnWidth(ISheet sheet, int maxColumn)
        {
            for (int columnNum = 0; columnNum < maxColumn; columnNum++)
            {
                int columnWidth = sheet.GetColumnWidth(columnNum) / 256;
                for (int rowNum = 0; rowNum < sheet.LastRowNum; rowNum++)
                {
                    IRow currentRow = sheet.GetRow(rowNum) ?? sheet.CreateRow(rowNum);
                    //当前行未被使用过
                    if (currentRow.GetCell(columnNum) != null)
                    {
                        ICell currentCell = currentRow.GetCell(columnNum);
                        int length = Encoding.Default.GetBytes(currentCell.ToString()).Length;
                        if (columnWidth < length)
                        {
                            columnWidth = length + 2;
                        }
                    }
                }
                sheet.SetColumnWidth(columnNum, columnWidth * 256);
            }
        }

        private static void SetCellValue(ICell cell, object obj, Type targetType = null)
        {
            if (obj == null)
            {
                cell.SetCellValue("");
                return;
            }

            if (targetType == null)
            {
                targetType = obj.GetType();
            }
            if (targetType == typeof(byte) || targetType == typeof(byte?)
                || targetType == typeof(short) || targetType == typeof(short?)
                || targetType == typeof(int) || targetType == typeof(int?))
            {
                cell.SetCellValue(Convert.ToInt32(obj));
            }
            else if (targetType == typeof(float) || targetType == typeof(float?)
                || targetType == typeof(double) || targetType == typeof(double?))
            {
                cell.SetCellValue(double.Parse(obj.ToString()));
            }
            else if (targetType == typeof(IRichTextString))
            {
                cell.SetCellValue((IRichTextString)obj);
            }
            else if (targetType == typeof(string))
            {
                cell.SetCellValue(obj.ToString());
            }
            else if (targetType == typeof(DateTime) || targetType == typeof(DateTime?))
            {
                cell.SetCellValue(((DateTime)obj).ToString("yyyy-MM-dd HH:mm:ss"));
            }
            else if (targetType == typeof(bool) || targetType == typeof(bool?))
            {
                cell.SetCellValue(Convert.ToBoolean(obj));
            }
            else
            {
                cell.SetCellValue(obj.ToString());
            }
        }

        }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是 C# 中读写 CSV 文件并使用 `DataTable` 相互转换的示例代码: ```csharp using System; using System.Data; using System.IO; class Program { static void Main(string[] args) { // 读取 CSV 文件DataTable DataTable dataTable = new DataTable(); using (var reader = new StreamReader(@"C:\data.csv")) { while (!reader.EndOfStream) { var line = reader.ReadLine(); var values = line.Split(','); // 第一行数据作为列名 if (dataTable.Columns.Count == 0) { foreach (var value in values) { dataTable.Columns.Add(value.Trim()); } } else { // 处理每行数据 DataRow row = dataTable.NewRow(); for (int i = 0; i < values.Length; i++) { row[i] = values[i].Trim(); } dataTable.Rows.Add(row); } } } // 将 DataTable 写入 CSV 文件 using (var writer = new StreamWriter(@"C:\output.csv")) { // 写入列名 for (int i = 0; i < dataTable.Columns.Count; i++) { writer.Write(dataTable.Columns[i]); if (i < dataTable.Columns.Count - 1) { writer.Write(","); } } writer.WriteLine(); // 写入数据 foreach (DataRow row in dataTable.Rows) { for (int i = 0; i < dataTable.Columns.Count; i++) { writer.Write(row[i].ToString()); if (i < dataTable.Columns.Count - 1) { writer.Write(","); } } writer.WriteLine(); } } Console.WriteLine("CSV 文件读取和写入完成!"); } } ``` 在这个示例代码中,我们使用 `StreamReader` 类来读取指定路径下的 CSV 文件,使用 `DataTable` 类来保存读取到的数据,同时将其转换为 `DataTable` 对象。我们遍历读取到的每行数据,并将第一行数据作为列名,将每行数据添加到 `DataTable` 中。接着我们使用 `StreamWriter` 类来创建一个新的 CSV 文件,并将 `DataTable` 对象中的数据写入到文件中。最后,程序输出一条消息表示 CSV 文件操作完成。 如果需要在程序中使用 `DataTable` 对象进行数据处理,可以使用以下代码将 `DataTable` 转换为 CSV 文件: ```csharp // 将 DataTable 写入 CSV 文件 using (var writer = new StreamWriter(@"C:\output.csv")) { // 写入列名 for (int i = 0; i < dataTable.Columns.Count; i++) { writer.Write(dataTable.Columns[i]); if (i < dataTable.Columns.Count - 1) { writer.Write(","); } } writer.WriteLine(); // 写入数据 foreach (DataRow row in dataTable.Rows) { for (int i = 0; i < dataTable.Columns.Count; i++) { writer.Write(row[i].ToString()); if (i < dataTable.Columns.Count - 1) { writer.Write(","); } } writer.WriteLine(); } } ``` 这段代码将 `DataTable` 的列名和每行数据写入到 CSV 文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值