it编程 > 编程语言 > Asp.net

C# winform操作CSV格式文件

7人参与 2025-03-06 Asp.net

实例一

实例效果

当在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 控件的常用属性

2 datatable常用的属性和方法

以上就是c# winform操作csv格式文件的详细内容,更多关于c#操作csv的资料请关注代码网其它相关文章!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

C#加锁防止并发的几种方法详解

03-06

最新版Anaconda安装教程

03-07

C#实现软件防破解和防调试的几种有效措施

03-07

基于C#实现语音合成播报器

03-06

C#实现一个相当全面的数据转换工具类

03-06

CentOS系统上安装Conda的详细指南

03-07

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论