Winform实现CSV文件读写

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;
            }
        }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值