Csv-DataTable-Excel格式的相互转换附StopWathch

Csv文件
百度问答中搜到的:所谓“CSV”,是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件。出现在档案总管中的档案类型是「逗号分格」,依计算机原来的设定,如果直接点选该档案,计算机将以EXCEL的模式开启该档案。但建议您千万不要这么做,因为CSV档如果以EXCEL开启,由于计算机档案数据转换的原因,会将其CRC之数值改做科学记号方式储存,而造成档案中的 CRC值发生错误。这也是笔者初出茅庐时所得到的惨痛经验,但如果想一窥CSV档的真实面貌,笔者建议您使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。开启后的CSV档包含了四或五个字段(部分),由左至右分别记载着:文件名称(XXXX.JPG)、档案大小(以BYTE为单位)、CRC32值(八个英文字母或数字组成)、档案路径(档案储存的子目录名称)和档案内容描述(一般来说都是明星的英文姓名甚或是专辑名称,也可能空白)。而其中第四栏「档案路径」因为每个人储存整理图档的方式不同,所以本栏通常不存在,而一般有含有「档案路径」这栏的CSV档,又称为ECSV档案.
在Office中,微软官方给他的格式名称:Microsoft Excel 逗号分隔值文件 (.csv)
***************************************************分割线*************************************************
一个Wince项目使用涉及了到3者之间的相互转换,并且有些转换时为了避免Excel中默认的科学计数法,特地在前面加上单引号.会特地说明.共引用两项COM引用
这里写图片描述

读取Cvs文件至DataTable,使用方式为Microsoft Text Driver查询
命名空间:Using System.Data.Odbc

string path = filePath + "\\" + fileName + ".csv";
string connString = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + filePath + ";Extensions=asc,csv,tab,txt";
            try
            {
                using (OdbcConnection odbcConn = new OdbcConnection(connString))
                {
                    odbcConn.Open();
                    OdbcCommand oleComm = new OdbcCommand();
                    oleComm.Connection = odbcConn;
                    oleComm.CommandText = "select * from [" + fileName + "#csv]";
                    OdbcDataAdapter adapter = new OdbcDataAdapter(oleComm);
                    DataSet ds = new DataSet();
                    adapter.Fill(ds, fileName);
                    odbcConn.Close();
                    return ds.Tables[0];
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

***************************************************分割线*************************************************
将DataTable转换为Excel文件-运行速度较快.6W条数据的去重加单引号重新生成大概时间为20秒.配置较差的电脑

 public static bool DoExport(System.Data.DataTable dt, string fullPath)
        {
            //创建excel文件程序实例
            Microsoft.Office.Interop.Excel.Application excelApp = new ApplicationClass();
            if (excelApp == null)
            {
                throw new Exception("Excel无法启动");
            }
            //在这里设置Excel文件的可见性
            excelApp.Visible = false;
            //这块是申明工作簿
            Workbooks wbs = excelApp.Workbooks;
            Workbook wb = wbs.Add(Missing.Value);
            Worksheet ws = (Worksheet)wb.Worksheets[1];
            int cnt = dt.Rows.Count;
            int columncnt = dt.Columns.Count;
            // *****************获取数据******************** 
            object[,] objData = new Object[cnt + 1, columncnt];  // 创建缓存数据 
            // 设置列标题 
            for (int i = 0; i < columncnt; i++)
            {
                objData[0, i] = dt.Columns[i].ColumnName;
            }
            // 设置具体数据 
            for (int i = 0; i < cnt; i++)
            {
            //DataRow表示DataTable中的一行数据
                System.Data.DataRow dr = dt.Rows[i];
                for (int j = 0; j < columncnt; j++)
                {
                    objData[i + 1, j] = dr[j];
                }
            }
            //********************* 写入Excel****************** 
            Range r = ws.get_Range(excelApp.Cells[1, 1], excelApp.Cells[cnt + 1, columncnt]);
            r.NumberFormat = "@";
            r.Value2 = objData;
            r.EntireColumn.AutoFit();
            //设置禁止弹出保存和覆盖提示
            excelApp.DisplayAlerts = false;
            excelApp.AlertBeforeOverwriting = false;
            excelApp.Application.Workbooks.Add(true).Save();
            //设置单元格保护,123456为密码
            ws.Protect("123456", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            //保存excel文件  
            ws.SaveAs(fullPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
            //确保Excel进程关闭   
            excelApp.Quit();
            excelApp = null;
            return true;
        }

***************************************************分割线*************************************************
比对两个DataTable中数据,s1已盘点,s2位已盘点,并且都加上单引号

   private static System.Data.DataTable GetNotChecked(System.Data.DataTable s1, System.Data.DataTable s2)
        {
            for (int i = 0; i < s2.Rows.Count; i++)
            {
                for (int j = 0; j < s1.Rows.Count; j++)
                {
                    if (s1.Rows[j][0].Equals(s2.Rows[i][0]))
                    {
                        s1.Rows.RemoveAt(j);
                    }
                    if (i == s2.Rows.Count - 1)
                    {
                        s1.Rows[j][0] = "'" + s1.Rows[j][0].ToString();
                    }
                }
            }
            return s1;
        }

***************************************************分割线*************************************************
根据DataTable生成CSv文件,主要使用方法StreamWriter

 private static void ExportCSV(System.Data.DataTable table, string path)
        {
            StreamWriter writer;
            bool comma = false;
            int columns = table.Columns.Count;
            using (writer = new StreamWriter(path, false, Encoding.Default))
            {
                foreach (DataColumn col in table.Columns)
                {
                    if (!comma) comma = true;
                    else writer.Write(',');
                    writer.Write(col.ColumnName);
                }
                writer.WriteLine();
                foreach (DataRow row in table.Rows)
                {
                    comma = false;
                    for (int c = 0; c < columns; c++)
                    {
                        if (!comma) comma = true;
                        else writer.Write(',');
                        writer.Write(row[c].ToString());
                    }
                    writer.WriteLine();
                }
            }
        }

***************************************************分割线*************************************************
删除DataTable中某一列数据重复的行,并加上单引号.输出DataTable

  private static void GetChecked(System.Data.DataTable s2)
        {
            List<int> indexList = new List<int>();
            // 找出待删除的行索引   
            for (int i = 0; i < s2.Rows.Count - 1; i++)
            {
                if (!IsContain(indexList, i))
                {
                    for (int j = i + 1; j < s2.Rows.Count; j++)
                    {
                        if (s2.Rows[i][0].ToString() == s2.Rows[j][0].ToString())
                        {
                            indexList.Add(j);
                        }
                    }
                }
                s2.Rows[i][0] = "'" + s2.Rows[i][0].ToString();
            }
            //将最后一行也加上'
            s2.Rows[s2.Rows.Count - 1][0] = "'" + s2.Rows[s2.Rows.Count - 1][0].ToString();
            //里面重新排序
            indexList.Sort();
            // 根据待删除索引列表删除行 
            for (int i = indexList.Count - 1; i >= 0; i--)
            {
                int index = indexList[i];
                s2.Rows.RemoveAt(index);
            }
        }
        /// <summary>
        /// 判断当前集合内是否已有待删除的索引
        /// </summary>
        /// <param name="indexList">存放集合的索引</param>
        /// <param name="index">索引</param>
        /// <returns>包含true不包含false</returns>
        public static bool IsContain(List<int> indexList, int index)
        {
            for (int i = 0; i < indexList.Count; i++)
            {
                int tempIndex = indexList[i];
                if (tempIndex == index)
                {
                    return true;
                }
            }
            return false;
        }

***************************************************分割线*************************************************
StopWathch
官方注解:提供一组方法和属性,可用于准确的测量运行时间
命名空间:using System.Diagnostics;
普通公共类,使用New创建
常用方法:
sw.Start();
官方注解:开始或继续测量某个时间间隔的运行时间
sw.Stop();
官方注解:停止测量某个时间间隔的运行时间
sw.E;apsed.ToString()
获取当前实例测量得出的总运行时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值