实例一
实例效果
当在winform界面中点击读取按钮时 将csv中的所有数据读取出来放置在datagridview控件,可以在datagridview控件中编辑数据,当点击保存按钮时 将datagridview控件中的所有数据存储在csv格式文件中。
实现代码
第一步ui界面搭建

第二步封装一个csv文件格式的操作类
public class csvapi
{
/// <summary>
/// 保存
/// </summary>
/// <param name="date"></param>
/// <param name="data"></param>
/// <param name="result"></param>
/// <param name="filename"></param>
public void savedata(string date,string data, string result,string filename)
{
using (streamwriter sw2 = new streamwriter(filename, true, encoding.default))
{
stringbuilder sb = new stringbuilder();
sb.append(date).append(",").append(data).append(",").append(result + "\n");
sw2.write(sb.tostring());
}
}
/// <summary>
/// 读取csv
/// </summary>
/// <returns></returns>
public string readdata(string filename)
{
streamreader sr = new streamreader(filename, encoding.default);
string s = sr.readtoend(); // 读取数据
sr.close();
sr.dispose();
return s;
}
}第三步实现按钮事件
public partial class form1 : form
{
public form1()
{
initializecomponent();
}
csvapi csv = new csvapi();
string filename = "./data.csv";
/// <summary>
/// 保存
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_click(object sender, eventargs e)
{
if (datagridview1.rows.count>0)
{
// 写入表头(将表头写死)
filestream fs = new filestream(filename, filemode.create, fileaccess.write);
streamwriter sw = new streamwriter(fs, encoding.default);
stringbuilder sb = new stringbuilder(); // 定义可变字符串,保存存储的数据
sb.append("时间").append(",").append("姓名").append(",").append("事件");
sw.writeline(sb);
sw.close();
sw.dispose();
fs.close();
fs.dispose();
for (int i = 0; i < this.datagridview1.rowcount-1; i++)
{
csv.savedata(this.datagridview1.rows[i].cells[0].value.tostring()+"", this.datagridview1.rows[i].cells[1].value.tostring() + "", this.datagridview1.rows[i].cells[2].value.tostring() + "", filename);
}
}
}
/// <summary>
/// 读取
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_click(object sender, eventargs e)
{
this.datagridview1.rows.clear();
if (!file.exists(filename))
{
messagebox.show("文件不存在");
return;
}
string[] strings = csv.readdata(filename).split('\n');
for (int i = 1;i < strings.length;i++)
{
if (!string.isnullorempty(strings[i]))
{
string[] vals = strings[i].split(',');
this.datagridview1.rows.add(vals);
}
}
}
}效果展示

实例二
实例效果
当在winform界面中点击读取按钮时弹出文件选择框,用户选择指定的csv文件然后将csv中的所有数据读取出来放置在datagridview控件,可以在datagridview控件中编辑数据,当点击保存按钮时 将datagridview控件中的所有数据存储在用户选择的csv格式文件路径中。
完整代码
public partial class form1 : form
{
public form1()
{
initializecomponent();
}
openfiledialog ofd = new openfiledialog();
//读取
private void button1_click(object sender, eventargs e)
{
//字符串-->datatable--->datasource
if(ofd.showdialog()==dialogresult.ok)
{
filestream fs = new filestream(ofd.filename, filemode.open);
streamreader sr = new streamreader(fs,encoding.default);//读取文件流数据
string data = "";//读出每一行的数据 "name ,age sex"
string[] lines;// 数据的数组
bool ishead = true; // 是否是表头
datatable dt = new datatable();// 为了给datagridview设置数据源的类型
while ((data=sr.readline())!=null) //先赋值给data 再判断data是否为空 ,不为空时候 一直读取
{
lines= data.split(','); //把每一行的数据使用逗号分隔 [name ,age ,sex]
if(ishead) //是不是表头[name ,age ,sex]
{
//遍历表头数组 给每一列添加标题
for(int i = 0; i < lines.length; i++)
{
dt.columns.add(lines[i]); //设置dt的列的数据源
}
ishead = false;
}
else //不是表头数据,每一行表格添加数据
{
datarow d1 = dt.newrow();// 指定datatable创建行
for (int i = 0; i < lines.length; i++)
{
d1[i] = lines[i];// 单元格设置值
}
dt.rows.add(d1);
}
}
//绑定数据源
if (dt.rows.count==0) //如果没行的 证明没数据
{
messagebox.show("没有数据","温馨提示");
}
else
{
//证明有数据 展示到控件上
//datagridview1.datasource = dt;
// datagridview1.columncount 列的个数
datagridview1.columncount = dt.columns.count;
//设置表头
for (int i = 0; i < dt.columns.count; i++)
{
// datagridview1.columns[i].headertext 表格控件的每一列的标题
datagridview1.columns[i].headertext = dt.columns[i].columnname;
}
//设置行数据
for (int i = 0; i < dt.rows.count; i++)
{
//datagridview1.rows. 设置表格控件的所有的行
datagridview1.rows.add(dt.rows[i].itemarray);
}
}
sr.close();
fs.close();
}
}
// 保存
private void button2_click(object sender, eventargs e)
{
//datasource-->datatable--->string
datatable dt = new datatable(); //创建datatable类型
//设置dt表头
//遍历控件列的个数,根据控件的列的个数设置dt列
for (int i = 0;i < datagridview1.columns.count;i++)
{
dt.columns.add(datagridview1.columns[i].headertext); //把控件列标题添加到dt列里面
}
//设置dt的行
for (int i = 0; i < datagridview1.rows.count; i++) //遍历控件几行
{
datarow row = dt.newrow(); //创建行
for (int j = 0; j < datagridview1.columns.count; j++) //遍历控件几列
{
//datagridview1[0,0] 根据几行几列取出表格数据
row[j] = datagridview1[j, i].value;
}
dt.rows.add(row);
}
//把dt数据转成字符串进行写入
savefiledialog sfd = new savefiledialog();
sfd.filter = "csv文件(*.csv)|.csv";
if(sfd.showdialog()==dialogresult.ok)
{
//开始写入
filestream fs = new filestream(sfd.filename, filemode.create);
streamwriter sw = new streamwriter(fs,encoding.default);
string data = "";// 写入的字符串
//表头转成字符串
for (int i = 0; i < dt.columns.count; i++)
{
data += dt.columns[i].columnname;// 把dt列标题取出拼接
if(i <dt.columns.count-1)
{
data += ","; // 列之间使用逗号隔开
}
}
sw.writeline(data); //写入表头
//写入行数据
data = null;//防止表头数据重复写入
for (int i = 0; i < dt.rows.count-1; i++)
{
for (int j = 0; j <dt.columns.count; j++)
{
data += dt.rows[i][j]; //几行几列数据拼接data
if(j<dt.columns.count-1)//不是最后一列
{
data += ",";
}
}
sw.writeline(data);//写入表数据
data=null;
}
sw.close();
fs.close();
}
}
}1 datagridview 控件的常用属性
- datagridview1.columns 表格控件的所有列
- datagridview1.columns .count 表格控件的所有列的个数
- datagridview1.rows 表格控件的所有行
- datagridview1[0,0] 根据几行几列取出表格数据
- datagridview1.columns[i].headertex 表格控件的列的文本内容
2 datatable常用的属性和方法
- datatable dt = new datatable(); 创建datatable类型
- datarow row = dt.newrow(); 创建一行
- dt.rows.add(row); 向datatable添加一行
- dt.columns.add(); 向datatable添加一列
- dt.columns datatable所有的列
- dt.rows datatable所有的行
- dt.columns[i].columnname;列标题
以上就是c# winform操作csv格式文件的详细内容,更多关于c#操作csv的资料请关注代码网其它相关文章!
发表评论