Winform实现CSV文件读写
一、读取操作
1、将CSV文件数据读取到DataTable中
public DataTable CsvToDataTable()
{
DataTable dt = new DataTable();
try
{
//FileShare.ReadWrite可以解决“正由另一进程使用,因此该进程无法访问该文件的问题”,因为文件还没关闭就被操作(move/delete/rewrite等)引起的错误
FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite,FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs, Encoding.Default);
string data;//将读取一行的数据存储到里面;
string[] lines;
bool isFirst = true;
//一行一行读取
while((data = sr.ReadLine()) != null)
{
lines = data.Split(',');//将data里的数据以,分隔开存入lines数组中
if (isFirst)//判断是否是第一次读取,就是读取每一列的第一个数据
{
//读首行
for (int i = 0; i < lines.Length; i++)
{
dt.Columns.Add(lines[i]);
}
isFirst = false;
}
else
{
DataRow dataRow = dt.NewRow();//如果不是第一次读取,就新增一行
for (int j = 0; j < lines.Length; j++)
{
dataRow[j] = lines[j];//将lines数组中的数据赋给这一行
}
dt.Rows.Add(dataRow);
}
}
sr.Close();
fs.Close();
return dt;
}catch(Exception ex)
{
MessageBox.Show(ex.Message);
return dt;
}
}
2、将DataTable中的数据读取到DataGridView中
/// <summary>
/// 将DataTable中的数据读取到DataGridView中
/// </summary>
/// <param name="dt"></param>
/// <param name="dgv"></param>
/// <returns></returns>
public bool DataTableToDataGridView(DataTable dt, DataGridView dgv)
{
try
{
dt = CsvToDataTable();
if (dt.Rows.Count == 0)
{
MessageBox.Show("没有数据可导出!", "提⽰", MessageBoxButtons.OK, MessageBoxIcon.Information);
return false;
}
dgv.ColumnCount = dt.Columns.Count;//datatable中的列数和datagridview中的列数相同
for (int i = 0; i < dt.Columns.Count; i++)
{
dgv.Columns[i].HeaderText = dt.Columns[i].ColumnName;
}
for (int i = 0; i < dt.Columns.Count; i++)
{
dgv.Rows.Add(dt.Rows[i].ItemArray);//将datatable中一行数据添加到datagridview中去
}
//调整格式
dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
dgv.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
}
二、文件写入操作
1、将datagridview中数据传入datatable中
/// <summary>
/// 将datagridview中数据传入datatable中
/// </summary>
/// <param name="dt"></param>
/// <param name="dgv"></param>
/// <returns></returns>
public DataTable DataGridViewToDataTable(DataGridView dgv)
{
DataTable dt = new DataTable();
try
{
for (int i = 0; i < dgv.Columns.Count; i++)
{
dt.Columns.Add(dgv.Columns[i].HeaderText);
}
for (int j = 0; j < dgv.Rows.Count; j++)
{
DataRow dr = dt.NewRow();
for (int k = 0; k < dgv.Columns.Count; k++)
{
dr[k] = dgv[k, j].Value;//将datagridview中某一单元格值传给datatablej行k列
}
dt.Rows.Add(dr);
}
return dt;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return dt;
}
}
2、将datatable中数据写入csv文件中
/// <summary>
/// 将DataTable中文件写入CSV文件中去
/// </summary>
/// <param name="dataGridView"></param>
/// <returns></returns>
public bool DataTableToCsv(DataTable dt)
{
try
{
FileStream fs = new FileStream(_path, FileMode.OpenOrCreate, FileAccess.ReadWrite,FileShare.ReadWrite);
StreamWriter sw = new StreamWriter(fs,Encoding.Default);
string data=null;
//将datatable中的第一行数据写入csv文件
for (int i = 0; i < dt.Columns.Count; i++)
{
data += dt.Columns[i].ColumnName.ToString();
//每一列列名后加“,”,除了最后一列
if (i < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
data = null;
//将table表中除了第一行的数据,其他数据全部写入csv文件
for (int j = 0; j < dt.Rows.Count; j++)
{
for (int k = 0; k < dt.Columns.Count; k++)
{
data += dt.Rows[j][k].ToString();
if(k < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
data = null;
}
sw.Close();
fs.Close();
return true;
}catch(Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
}