导航

C#笔记-03:通过StreamWriter将Datatable导出为Excel文件

Posted on 2020-12-14 20:33  ErgoCogito  阅读(762)  评论(0编辑  收藏  举报

通过StreamWriter将Datatable导出为Excel文件

代码

        /// <summary>
        /// 导出文件,使用文件流。该方法使用的数据源为DataTable,导出的Excel文件没有具体的样式。
        /// </summary>
        /// <param name="dt"></param>
        public static string ExportToExcel(System.Data.DataTable dt, string path)
        {
            KillSpecialExcel();
            string result = string.Empty;
            try
            {
                // 实例化流对象,以特定的编码向流中写入字符,该步骤会创建一个没有数据的excel文件
                StreamWriter sw = new StreamWriter(path, false, Encoding.GetEncoding("gb2312"));
 
                StringBuilder sb = new StringBuilder();
                for (int k = 0; k < dt.Columns.Count; k++)
                {
                    // 添加列名称
                    sb.Append(dt.Columns[k].ColumnName.ToString() + "\t");
                }
                sb.Append(Environment.NewLine);
                // 添加行数据
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow row = dt.Rows[i];
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        // 根据列数追加行数据
                        sb.Append(row[j].ToString() + "\t");
                    }
                    sb.Append(Environment.NewLine);
                }
                sw.Write(sb.ToString());//将datatable内容写入文件中。
                sw.Flush();
                sw.Close();
                sw.Dispose();
 
                // 导出成功后打开
                //System.Diagnostics.Process.Start(path);
            }
            catch (Exception)
            {
                result = "请保存或关闭可能已打开的Excel文件";
            }
            finally
            {
                dt.Dispose();
            }
            return result;
        }
        /// <summary>
        /// 结束进程
        /// </summary>
        private static void KillSpecialExcel()
        {
            foreach (System.Diagnostics.Process theProc in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
            {
                if (!theProc.HasExited)
                {
                    bool b = theProc.CloseMainWindow();
                    if (b == false)
                    {
                        theProc.Kill();
                    }
                    theProc.Close();
                }
            }
        }

参考链接1

参考连接2

但是以上代码并不十分适用我的项目,于是我做了些许修改以适用我的项目;在将datatable写入文件之前,判断数据是否为空。

修改后的代码

        public static string ExportToExcel(DataTable dt, string path)
        {
            KillSpecialExcel();
            string result = string.Empty;
            try
            {
                StringBuilder sb = new StringBuilder();
                for (int k = 0; k < dt.Columns.Count; k++)
                {
                    // 添加列名称
                    sb.Append(dt.Columns[k].ColumnName.ToString() + "\t");
                }
                sb.Append(Environment.NewLine);
                // 添加行数据
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    DataRow row = dt.Rows[i];
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        // 根据列数追加行数据
                        sb.Append(row[j].ToString() + "\t");
                    }
                    sb.Append(Environment.NewLine);
                }
                //写入前检测datatable是否为空,若为空,则不写入文件
                if (dt.Rows.Count > 0)
                {
                    // 实例化流对象,以特定的编码向流中写入字符。
                    StreamWriter sw = new StreamWriter(path, false, Encoding.GetEncoding("gb2312"));

                    //写入文件操作
                    sw.Write(sb.ToString());
                    sw.Flush();
                    sw.Close();
                    sw.Dispose();

                    MessageBox.Show("导出数据成功,路径:"+path,"提示");//导出成功,提示用户并告知路径。
                }
                else
                {
                    MessageBox.Show("导出数据为空","提示");
                }

                // 导出成功后打开
                //System.Diagnostics.Process.Start(path);
            }
            catch (Exception)
            {
                result = "请保存或关闭可能已打开的Excel文件";
            }
            finally
            {
                dt.Dispose();
            }
            return result;
        }