您的位置:首页 > 运维架构

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

2015-11-13 14:25 274 查看
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)

[b]***************************************************[/b]分割线[b]*************************************************[/b]

一个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;
}
}


[b]***************************************************[/b]分割线[b]*************************************************[/b]

将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];  // 创建缓存数据
//
c8c4
设置列标题
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;
}


[b]***************************************************[/b]分割线[b]*************************************************[/b]

比对两个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;
}


[b]***************************************************[/b]分割线[b]*************************************************[/b]

根据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();
}
}
}


[b]***************************************************[/b]分割线[b]*************************************************[/b]

删除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;
}


[b]***************************************************[/b]分割线[b]*************************************************[/b]

StopWathch

官方注解:提供一组方法和属性,可用于准确的测量运行时间

命名空间:using System.Diagnostics;

普通公共类,使用New创建

常用方法:

sw.Start();

官方注解:开始或继续测量某个时间间隔的运行时间

sw.Stop();

官方注解:停止测量某个时间间隔的运行时间

sw.E;apsed.ToString()

获取当前实例测量得出的总运行时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: