C# 将Datatable的数据导出至指定的excel模板案例

这篇具有很好参考价值的文章主要介绍了C# 将Datatable的数据导出至指定的excel模板案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       首先说一下需求,用户需要将一个报表的数据导出到指定的excel模板,再将这个excel模板发给客户,客户填写信息后,用户再使用该界面进行导入反写。主要功能为查询、导出、导入与保存。

      (1)查询功能,这个就是从数据库中查询数据再显示到gridControl1上,就不贴代码了。

      (2)导出功能,C#操作excel有很多方法,例如 Microsoft.Office.Interop.Excel  、Aspose.cells、NPOI等,我选的是引用 Microsoft.Office.Interop.Excel。注意:这个组件的索引是从1开始的!

        

        /// <summary>
        /// 导出数据至excel模板(使用Microsoft.Office.Interop.Excel组件的方式)
        /// </summary>
        public void ExportExcel(DataTable DT)
        {
            try
            {
                //需要添加 Microsoft.Office.Interop.Excel引用 
                Microsoft.Office.Interop.Excel.Application app = new                                                 
                Microsoft.Office.Interop.Excel.Application();
                if (app == null)//服务器上缺少Excel组件,需要安装Office软件
                {
                    return;
                }
                app.Visible = false;
                app.UserControl = true;
                //添加模板至项目启动的debug文件夹中
                string strTempPath = Application.StartupPath + @"\OfficeTemplate\模版.xls";
                Microsoft.Office.Interop.Excel.Workbooks workbooks = app.Workbooks;
                Microsoft.Office.Interop.Excel._Workbook workbook = workbooks.Add(strTempPath); //加载模板
                Microsoft.Office.Interop.Excel.Sheets sheets = workbook.Sheets;
                Microsoft.Office.Interop.Excel._Worksheet worksheet =                             
               (Microsoft.Office.Interop.Excel._Worksheet)sheets.get_Item(1); //第一个工作薄。
                if (worksheet == null)//工作薄中没有工作表
                {
                    return;
                }

                //1、获取数据
                int rowCount = DT.Rows.Count;
                if (rowCount < 1)//没有取到数据
                {
                    return;
                }

                //表头信息
                worksheet.Cells[5, 3] = DT.Rows[0]["日期"].ToString();
                worksheet.Cells[5, 10] = DT.Rows[0]["名称"].ToString();

                //此项目需要先插入需要的行 再进行赋值
                  object MisValue = Type.Missing;
                   for (int i = 1; i <= rowCount; i++)
                {
                    //从第八行开始新增 插入一行
                    Microsoft.Office.Interop.Excel.Range xlsRows = 
                 (Microsoft.Office.Interop.Excel.Range)worksheet.Rows[9, MisValue];
                 xlsRows.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown, MisValue);

                }
             //2、写入数据,Excel索引从1开始
                for (int i = 1; i <= rowCount; i++)
                {

                    int row_ = 7 + i;  //Excel模板上表头占了1行
                    int dt_row = i - 1; //dataTable的行是从0开始的 
                    worksheet.Cells[row_, 1] = DT.Rows[dt_row]["列名1"].ToString();
                    worksheet.Cells[row_, 2] = DT.Rows[dt_row]["列名2"].ToString();
                    worksheet.Cells[row_, 3] = DT.Rows[dt_row]["列名3"].ToString();
                    worksheet.Cells[row_, 4] = DT.Rows[dt_row]["列名4"].ToString();
         

                /* 此为注释内容无需注意
                     string strNum = DT.Rows[dt_row]["数量"].ToString() == "" ? "0" : 
                    DT.Rows[dt_row]["数量"].ToString();
                    if (strNum.Contains("."))
                    {//字符串为浮点数
                        strNum = strNum.TrimEnd('0').TrimEnd('.');//1.00000
                    }
                    amount = amount + Convert.ToInt32(strNum);*/


                }

                //设置导出文件路径
                //string dir = System.Environment.CurrentDirectory;//当前工作目录完全限定
                string dir = System.Environment.SystemDirectory;//系统目录的         
                string filePath = FileDialogHelper.SaveExcel("需要填写的文件名", dir);

                if (!string.IsNullOrEmpty(filePath))
                {
                    try
                    {
                        //保存生成的Excel文件
                        workbook.SaveAs(filePath, Missing.Value, Missing.Value,                 
                        Missing.Value, Missing.Value, Missing.Value, 
                        Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, 
                        Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                        Msg.ShowInformation("保存成功");
                        workbook.Close();
                    }
                    catch (Exception ex)
                    {
                        Msg.ShowException(ex);
                    }
                }

            
              }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

        }

 

  //保存excel的类
 public class FileDialogHelper
    {
       public static string SaveExcel(string file, string path)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.InitialDirectory = path;
           // saveFileDialog.Filter = "excel2003|*.xls|excel2007|*.xlsx";
            saveFileDialog.Filter = "excel2007|*.xls|excel2003|*.xlsx";
            saveFileDialog.RestoreDirectory = true;
            saveFileDialog.FileName = file;//文件名赋值
            saveFileDialog.FilterIndex = 1;
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                return saveFileDialog.FileName;
            }
            return "";
        }




    }

(3)导入功能,我选择引用Aspose.cells来导入数据。注意:这个组件的索引是从0开始的!

    private void barButtonItem5_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
   try
            {
                if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    string _filePath = openFileDialog1.FileName;
                    if (_filePath != "")
                    {
                        using (FileStream fs = new FileStream(_filePath, FileMode.Open, FileAccess.Read))
                        {
                            DataTable dt = Table();
                            Workbook wk = new Workbook();//工作簿
                            wk.Open(fs);  //打开excel文档
                            Worksheet worksheet = wk.Worksheets[0];//工作表
                            Cells cells = worksheet.Cells;//获取worksheet所有单元格
                            //判断excel导入格式
                            if (!cells[4, 1].StringValue.Contains("日期"))
                            {
                                MessageBox.Show("导入的文档格式不对,请选择正确格式的文档导入!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                return;
                            }
                            //循环遍历所有单元格信息
                            for (int i = 7; i <= cells.Rows.Count; i++)
                            {
                                if (string.IsNullOrEmpty(cells[i, 0].StringValue.Trim()))
                                {
                                    break;
                                }
                                DataRow dr = dt.NewRow();
                                dr["表头1"] = cells[4, 2].StringValue.Trim();
                                dr["表头2"] = cells[4, 5].StringValue.Trim();
                                dr["表头3"] = cells[4, 7].StringValue.Trim();
                                dr["表头4"] = cells[4, 9].StringValue.Trim();
                                dr["列名1"] = cells[i, 0].StringValue.Trim();
                                dr["列名2"] = cells[i, 1].StringValue.Trim();
                                dr["列名3"] = cells[i, 2].StringValue.Trim();
                                dr["列名4"] = cells[i, 3].StringValue.Trim();
                                
                                dt.Rows.Add(dr);
                            }
                            gridControl1.DataSource = dt;
                            gridView1.BestFitColumns();
                        }

                    }
                }
            }
            catch (Exception es)
            {
                MessageBox.Show(es.ToString());
            }
}

 文章来源地址https://www.toymoban.com/news/detail-619436.html

到了这里,关于C# 将Datatable的数据导出至指定的excel模板案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#创建DataTable并填充数据,按钮事件实现全选,并到全选的值。wpf开发

    wpf开发中,用事件创建一个datatable度填充到datagird里面,在datagrid里面有第一列是复选框。用一单击事件实现全选,用一个按钮事件得到所选中的值。 Window x:Class=\\\"WpfApp4.MainWindow\\\"         xmlns=\\\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\\\"         xmlns:x=\\\"http://schemas.microsoft.com

    2024年02月08日
    浏览(36)
  • C#中DataTable实现筛选查询

    2024年02月15日
    浏览(36)
  • C# Winform DataGridView 控件和 DataTable

    目录 一、概述 二、DataTable 的用法 1.创建表和列 2.添加行 3.取值和赋值 4.删除行 5.遍历 DataTable 6.判断 DataTable 列中是否存在某个值 7.设置主键 8.获取 DataRow 所在的行号 9.DataTable 转换为 List 10.将 List 转 DataTable 三、DataGridView 的用法 1.绑定数据 2.获取绑定的数据源 3.获取 / 设置

    2024年02月10日
    浏览(43)
  • C# DataTable和List之间相互转换

    最近在捣鼓DataTable,弄到了类型转换,既然弄了,那就整个记录。有不足之处,请多多指教。我看了一下目前的转换方式基本上都大差不差,基本上都是通过反射来操作的。本文介绍的两种方式也都是利用反射来完成的。两种方式都写成的通用类,仅供参考。 DataTable DataTab

    2024年02月01日
    浏览(36)
  • C# 在控制台整齐的输出 DataTable

    效果: 在 Winform 平台,可以用 DataGridView 这样的控件来显示数据库的表单数据,但在 C# 控制台项目中,如果有用到数据库查询,我们想看看查询语句的效果,就比较困难了,比如,我随意写了一个控制台输出,代码如下: 效果: 在 Navicat 16 for MySQL 软件中的查询结果 由于没

    2024年02月12日
    浏览(64)
  • C#中将DataTable转化成ListT的方法解析

    在C#中,数据的操作是至关重要的一个方面,常常需要将数据从一个形式转换成另一个形式以满足我们的需求。其中,DataTable和List是常见的两种数据形式。DataTable是一种表格形式的数据类型,它以行和列的形式存储数据。List是一种集合类型,它可以存储任意类型的对象,并且

    2024年02月16日
    浏览(42)
  • 【C#】实体类和DataTable之间相互转换,实体反射动态遍历列

    在实际项目中,经常会用到数据之间的相互转换,序列化和反序列化就是常见场景。这里我们只简单聊聊实体类和DataTable之间的相互转换,可以用于不同业务场景使用。 要将C# DataTable 转换为 Model 实体类,你可以使用反射来获取 DataTable 的列和值,并通过实例化 Model 类来赋值

    2024年02月15日
    浏览(34)
  • 循环可变化的集合 数组 datatable 等 || c# winfrom DataGridView 动态UI下载功能

          1,使用组件DataGridView 2,使用DataSource来控制表格展示的数据来源(注意:来源需要是DataTable类型) 3,需要用到异步线程。如果是不控制数据源的话,需要使用UI安全线程;(使用Control.Invoke或Control.BeginInvoke方法) 4,DataGridView的列如果设置图片,尽量代码设置 5,DataT

    2024年02月19日
    浏览(42)
  • 工具类——Java导出EXCEL2(设置样式、加载并填充图片、加载指定模板、大数据量设置窗口大小与刷新频率)

    书接上篇:工具类——Java 浏览器导入、导出Excel(Java import、export)demo POI的导出方式:创建/加载Workbook,设置样式,填充数据,然后生成本地临时文件,最终以浏览器的形式打开,完成整个导出动作。 demo如下, demo如下, XSSFClientAnchor anchor = new XSSFClientAnchor(int dx1, int dy1,

    2024年02月01日
    浏览(42)
  • DataTable数据对比

    开发中我们经常会出现查询数据库后返回DataTable的情况,那么DataTable中常用的一些操作阁下又了解多少呢,例如:两个结构不同DataTable怎么找出他们俩之间的交集和差集。 示例:这里的情况是我们要过滤掉老数据取到新数据,其中: dt:是查询到的所有数据。 dt的数据: a

    2024年02月16日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包