WinForm使用Aspose.cells利用模板导出Excel

2023-05-16

Aspose是一个处理文件格式的组件,可对Words、Excel等工具进行操作,实现代码数据导出。在这里我介绍以及提供Aspose对Excel(Aspose.Cells)导出的工具类。

1.首先介绍Aspose.Cells的基础知识:

A.Excel模板变量的定义(详细可在官网查看详细:http://www.aspose.com/docs/display/cellsnet/Using+Smart+Markers#UsingSmartMarkers-skip):

(1)普通变量格式:&=$name

(2)datatable导出格式(会自动添加多行):&=dtname.columnnae.(注:在column可添加别的标识,numeric:转化为数字,如果你在Excel中写好了公式计算,最好加上否则结果会计算错,noadd:导出的时候不添加新行,只是把数据放到Excel表格中,也就是说样式都是模板的样式,未添加时,样式则为Excel普通样式,skip:n 跳过n行,一般可以与分组结合起来使用,标识不同的分组,group:normal,分组,有多种样式,normal为普通样式,merge,repeat为另外两种样式,还有其他ascending,horizontal,shift ,copystyle等,由于没用到所以不是很了解,不满足你的需求,可以到官网查看)

(3)等

(4)这里是模板的例子:

B.直接上工具类代码(代码以及插件dll可在这里Aspose.Cells工具类下载,密码:zre7):

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using Aspose.Cells;


namespace TestNamespace
{
    public class TemplateExcelHelper
    {
        #region 根据Excel模板导出 string DataTable Dictionary<String,Object>
        /*
         * templatePath 模板路径(一般在bin/debug目录下)
         * dtSource 数据源(datatable数据源,表名必须与模板中的对象对应)
         * dictSource 附加信息 
         */
        public static void TemplateExportExcel(string templatePath, DataTable dtSource, Dictionary<String,Object> dictSource)
        {
            SaveFileDialog sf = new SaveFileDialog();
            sf.Filter = "Excel files (*.xls)|*.xls";
            string path = System.IO.Path.Combine(Application.StartupPath, templatePath);
            WorkbookDesigner designer = new WorkbookDesigner();
            try
            {
                designer.Open(path);
            }
            catch (Exception ex)
            {
                if (sf.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        ExcelHelper.ExportExcel(dtSource, sf.FileName);//找不到制定模板时,按标准导出导出模板
                        MessageBox.Show("保存成功", "提示");
                    }
                    catch (Exception ex2)
                    {
                        MessageBox.Show(ex2.Message, "异常");
                    }
                }
                return;
            }
//设置数据源
            designer.SetDataSource(dtSource);
            if (dictSource != null && dictSource.Count > 0) {
                foreach (var keyValuePair in dictSource) {
                    designer.SetDataSource(keyValuePair.Key, keyValuePair.Value);
                }
            }
            designer.Process();
            if (sf.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    string saveFile = System.IO.Path.Combine(Application.StartupPath, sf.FileName);
                    designer.Save(saveFile);
                    MessageBox.Show("导出成功", "提示");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "异常");
                }
            }
        }
        #endregion


        #region 根据Excel模板导出 string DataGridView Dictionary<String,Object>
        /*
         * templatePath 模板路径(一般在bin/debug目录下)
         * datagridView 数据源(Datatable或DatagridView数据源信息)
         * dictSource 附加信息 
         */
        public static void TemplateExportExcel(string templatePath, DataGridView datagridView,string tablename, Dictionary<String, Object> dictSource)
        {
            TemplateExportExcel(templatePath, GetDgvToTable(datagridView,tablename), dictSource);
        }
        #endregion


        #region datagridview数据源转化为datatable
        public static DataTable GetDgvToTable(DataGridView dgv,string tablename)
        {
            DataTable dt = new DataTable();
            for (int count = 0; count < dgv.Columns.Count; count++)
            {
                DataColumn dc = new DataColumn(dgv.Columns[count].Name.ToString());
                dt.Columns.Add(dc);
            }
            for (int count = 0; count < dgv.Rows.Count; count++)
            {
                DataRow dr = dt.NewRow();
                for (int countsub = 0; countsub < dgv.Columns.Count; countsub++)
                {
                    dr[countsub] = Convert.ToString(dgv.Rows[count].Cells[countsub].Value);
                }
                dt.Rows.Add(dr);
            }
            dt.TableName = tablename;
            return dt;
        }
        #endregion


        /// <summary>
        /// 导出Excel,拓展
        /// </summary>
        /// <param name="templatePath">模板路径</param>
        /// <param name="ds">数据集</param>
        /// <param name="dictSource">附加信息数据源,添加fileNames导出多个文件</param>
        /// <param name="isDivsion">是否将附加信息分割,true:导出多个Excel,false:只导出一个Excel</param>
        #region 
        public static void TemplateExportExcel(string templatePath, DataSet ds,Dictionary<String, Object> dictSource,bool isDivsion,string tableName)
        {
            SaveFileDialog sf = new SaveFileDialog();
            sf.Filter = "Excel files (*.xls)|*.xls";
            string path = System.IO.Path.Combine(Application.StartupPath, templatePath);
            WorkbookDesigner designer = new WorkbookDesigner();
            
            //获取保存多个文件时的后缀
            string[] fileNameSuffix = null;
            if (isDivsion)
            {
                if (dictSource.ContainsKey("fileNames"))//存在文件名属性集合时
                {
                    fileNameSuffix = (string[])dictSource["fileNames"];
                }
                else
                { //不存在时,自定义文件名
                    fileNameSuffix = new string[ds.Tables.Count];
                    for (int i = 0; i < fileNameSuffix.Length; i++)
                    {
                        fileNameSuffix[i] = "_" + i;
                    }
                }
            }
            try
            {
                designer.Open(path);
            }
            catch (Exception ex)
            {
                if (sf.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        ///导出一个Excel,默认为第一个表格
                        if (!isDivsion)
                        {
                            ExcelHelper.ExportExcel(ds.Tables[0], sf.FileName);
                            MessageBox.Show("导出成功", "提示");
                        }
                        else {
                            for (int i = 0; i < ds.Tables.Count;i++ )
                            {
                                ExcelHelper.ExportExcel(ds.Tables[i], sf.FileName.Insert(sf.FileName.LastIndexOf("."), fileNameSuffix[i]));
                            }
                            MessageBox.Show("导出成功","提示");
                        }
                    }
                    catch (Exception ex2)
                    {
                        MessageBox.Show(ex2.Message, "异常");
                    }
                }
                return;
            }
            if (sf.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if (!isDivsion)
                    {
                        if (ds != null)
                        {
                            designer.SetDataSource(ds);
                        }
                        designer.Process(); 
                        string saveFile = System.IO.Path.Combine(Application.StartupPath, sf.FileName);
                        designer.Save(saveFile);
                        MessageBox.Show("导出成功", "提示");
                    }
                    else {
                        if (ds != null)
                        {
                            for (int i = 0; i < ds.Tables.Count; i++)
                            {
                                DataTable table = ds.Tables[i].Copy();
                                table.TableName = tableName;
                                string saveFile = System.IO.Path.Combine(Application.StartupPath,sf.FileName.Insert(sf.FileName.LastIndexOf("."),fileNameSuffix[i]));
                                TempleExportExcelNormal(templatePath, table, dictSource, saveFile);
                            }
                        }
                        MessageBox.Show("导出成功", "提示");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "异常");
                }
            }
        }
        #endregion
    }

        /// <summary>
        ///  update 2018/7/18 yzy
        /// </summary>
    public static void TempleExportExcelNormal(string templatePath, DataTable dt, Dictionary<String, Object> dictSource, string saveFile)
        {
            try
            {
                string path = System.IO.Path.Combine(Application.StartupPath, templatePath);
                WorkbookDesigner designer = new WorkbookDesigner();
                designer.Open(path);
                if (dictSource != null && dictSource.Count > 0)
                {
                    foreach (var keyValuePair in dictSource)
                    {
                        designer.SetDataSource(keyValuePair.Key, keyValuePair.Value);
                    }
                }
                dt.Columns.Add("组id");
                int pages = 1;
                int count = dt.Rows.Count;
                int cutCount = count - 25;
                if (count > 25)
                {
                    if (cutCount % 50 == 0)
                    {
                        pages = cutCount / 50 + 1;
                    }
                    else
                    {
                        pages = cutCount / 50 + 2;
                    }
                }
                int id = 0 ;
                for (int i = 0; i < count; i++) {
                    if (i == 25)
                    {
                        id++;
                    }
                    else if ((count - 25) % 50 == 0 && i>25)
                    {
                        id++;
                    }
                    dt.Rows[i]["组id"] = id;    
                }
                designer.SetDataSource(dt);
                designer.Process();
                designer.Save(saveFile);
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message,"异常");
            }
        }
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WinForm使用Aspose.cells利用模板导出Excel 的相关文章

  • Java8 如何正确使用 Optional

    引用 http www importnew com 26066 html Optional是Java8提供的为了解决null安全问题的一个API 善用Optional可以使我们代码中很多繁琐 丑陋的设计变得十分优雅 这篇文章是建立在你对Op
  • git清除本地账户

    删除保存在本地的git账户 git credential manager uninstall 缓存账户 git config global credential helper wincred
  • 服务注册与发现eureka

    目录 eureka server pom xml文件添加依赖 启动类添加注解 64 EnableEurekaServer appication yml配置文件 访问界面 eureka client pom xml文件添加依赖 启动类添加注解
  • 服务消费者RestTemplate+Ribbon

    目录 简介 pom xml添加依赖 通过 64 LoadBalanced注解表明这个restRemplate开启负载均衡的功能 这样 restTemplate访问接口就可以实现负载均衡功能了 简介 spring cloud有两种服务调用方式
  • 服务消费者Feign

    Feign简介 Feign是一个声明式的伪Http客户端 xff0c 它使得写Http客户端变得更简单 使用Feign xff0c 只需要创建一个接口并注解 它具有可插拔的注解特性 xff0c 可使用Feign 注解和JAX RS注解 Fe
  • 熔断器Hystrix

    目录 概述 在ribbon使用断路器 断路器简介 添加依赖 启动类添加注解 64 EnableHystrix 方法上添加 64 HystrixCommand 关闭service hi服务 Feign中使用断路器 开启断路器功能 修改 64
  • Hystrix Dashboard (断路器:Hystrix 仪表盘)

    目录 pom xml添加依赖 启动类添加 64 EnableHystrixDashboard注解 浏览器访问 pom xml添加依赖 lt dependency gt lt groupId gt org springframework bo
  • nexus3私服搭建

    应用场景 maven库分为本地仓库和远程仓库 包括私服和中央仓库 xff09 公司自己设立 xff0c 只为公司内部共享使用 xff0c 同时减少外部访问和下载频率等 使用Nexus搭建私服 下载 官网链接 xff1a https www
  • Java多种方法实现等待所有子线程完成再继续执行

    简介 在现实世界中 xff0c 我们常常需要等待其它任务完成 xff0c 才能继续执行下一步 Java实现等待子线程完成再继续执行的方式很多 我们来一一查看一下 Thread的join方法 该方法是Thread提供的方法 xff0c 调用j
  • nexus3私服使用

    使用功能包括 代理中央仓库 Snapshot包的管理 Release包的管理 第三方Jar上传到Nexus上 从nexus下载依赖jar 代理中央仓库 只要在PMO文件中配置私服的地址即可 获取jar包信息走私服 xff0c 然后私服保存的
  • springboot开启的两种方式

    目录 继承spring boot starter parent项目 导入spring boot dependencies项目依赖 Spring Boot依赖注意点 属性覆盖只对继承有效 资源文件过滤问题 使用Spring Boot很简单 x
  • SpringBoot 中怎么禁用某些自动配置特性?

    有 3 种方法 如果我们想禁用某些自动配置特性 xff0c 可以使用 64 EnableAutoConfiguration 或 64 SpringBootApplication 注解的 exclude 属性来指明 方案1 xff0c 下面的
  • vim用法和技巧

    引子 研发线上使用最多的编辑器 xff0c 就是vi 无论是最快查看某个文件内容 xff0c 还是快速编辑某个文件 xff0c vi都能帮上忙 软件世界貌似有一些非常长寿的东西 xff0c vi算是一个 本篇文章聚焦的是研发线上最常用的一些
  • JAVA开启线程的三种方式

    目录 继承Thread类 实现Runnable接口 通过Callable和Future创建对象 继承Thread类 定义Thread类的子类 xff0c 并重写run xff08 xff09 方法创建该子类的实例 xff0c 即创建了线程对
  • Java并发编程:Callable、Future和FutureTask

    原文链接 xff1a https www cnblogs com dolphin0520 p 3949310 html Java并发编程 xff1a Callable Future和FutureTask 在前面的文章中我们讲述了创建线程的2
  • @Component@Import@Bean加载顺序解析

    前言 我们在使用Spring注入Bean对象时 xff0c 会使用不同注解 xff0c 比如 64 Component 64 Service 64 Controller 64 Import 64 Bean等 由于 64 Service 64
  • Python输出xml文件

    代码实例 xff1a from xml dom import minidom import os def get cur path return os getcwd def make xml 创建Document xml 61 minido
  • python3:四种常见方式从远程服务器下载文件(paramiko、requests、wget、urllib2)

    paramiko 下载一个文件夹时 xff0c 便可以使用这个方法 xff0c paramiko模块提供了ssh及sftp进行远程登录服务器执行命令和上传下载文件的功能 这是一个第三方的软件包 xff0c 使用之前需要先进行安装 pip s
  • kali系统更新之后桌面图标不见了的解决方法

    命令行下 xff1a gnome tweaks 或者 xff1a 显示应用程序 软件 附加组件 在扩展 xff08 extention xff09 那一栏里面有个 Desktop icons这个选项 xff0c 如果没见到 xff0c CT
  • linux下ftp上传文件用nginx访问时403错误解决办法

    编辑nginx配置文件 xff1a vim usr local nginx conf nginx conf 修改文件中两个地方就可以了 xff0c 一个是开启root的权限 xff0c 一个是指定图片文件夹的根路径 xff0c 下面配置文件

随机推荐

  • wwwwwwwwwwwww

    wwwwwwwwwwwwww
  • xrdp 登录保持相同的登陆会话 (xfce-session)

    问题描述 在按照 1 中的步骤 xff0c 利用 Ubuntu 16 04 43 xrdp 43 Xfce 实现 Windows 远程桌面连接 Linux 后发现一个问题 xff0c 有的时候重启电脑 IP 改变 程桌面卡死 网络中断或者点
  • VNC登录失败:Authentication Failure-20201208

    1 配置好putty之后 xff0c 登录VNC出现问题 xff0c 换了多个端口都不行 2 然后看到说明文档最后给了一个重置密码 xff0c 就试了一下 xff0c 我的password和verify都是一样的密码 xff0c 都是之前初
  • Origin pro更改语言灰色时的解决办法

    从官网下载的origin pro学生版在激活以后change language按钮是灰色的 xff0c 修改注册表也是提示失败 解决方法如下 通过给origin发邮件 xff0c 得到了如下的答复 I guess you were usin
  • 【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名

    文章目录 1 前言2 基本步骤3 详细过程3 1 解压update zip到指定目录3 2 编辑OTA文件3 2 1 编辑 updater script3 2 2 删除tvconfig img文件3 2 3 确认OTA签名文件 3 3 重新
  • 编程语言学习——0基础C语言入门

    自我介绍 我是一名即将升入大三的计算机科学与技术专业的学生 xff0c 这是我第一次在CSDN上发表文章 xff0c 在平时写代码时我会经常遇到许许多多的问题 xff0c 所以在这个假期中我想不断地充实自己 xff0c 让自己的专业知识基础
  • JSONArray 添加过滤和删除的指定元素的功能

    JSONObject o1 61 new JSONObject o1 put 34 key 34 34 2 34 o1 put 34 key2 34 34 3 34 JSONObject o2 61 new JSONObject o2 pu
  • 用R语言生成均匀设计

    实践中 xff0c 对于多因素的试验设计 xff0c 以往多是采用正交设计 最近 xff0c 有人咨询我 xff0c 两个因素4个水平的正交设计是怎样的 xff1f 我运行了DoE base包里的oa design xff0c 结果令人诧异
  • Win10睡眠后自动唤醒启动的问题

    Win10刚安装上一切都挺好的 xff0c 不知从何时起 xff0c 突然发现无法进入睡眠状态了 因为有时图方便 xff0c 晚上不关机 xff0c 通常在半小时后会进入睡眠状态 xff0c 也就是除了内存 xff0c 电脑会关闭其他设备的
  • VTR安装过程中的错误汇总(一)

    在github上下载得到VTR源码之后 xff0c 首先要在其目录下运行命令 install apt packages sh 但在允许这个命令时出现错误 xff0c 部分提示信息为 xff1a The following packages
  • 神级输入法小狼豪输入法设置

    重新佈署的操作方法 中州韵 点击输入法状态栏上的 Deploy 按钮 小狼毫 在托盘图标上右键选择 重新佈署 鼠鬚管 在系统语言文字选单中选择 重新佈署 对设置的修改於重新佈署后生效 编译新的输入方案需要一段时间 xff0c 此间若无法输出
  • FTP多目录和多用户配置(用户隔离/虚拟目录)

    FTP多目录和多用户配置 xff08 用户隔离 虚拟目录 xff09 假设有四个部门分别是user1 user2 user3 admin 要求四个部门都有各自有独立的访问目录 xff0c 且admin部门可以访问其他部门的文件但不能对其进行
  • Android ViewBinding 使用指南— 全新的视图绑定工具

    通过视图绑定功能 xff0c 您可以更轻松地编写可与视图交互的代码 在模块中启用视图绑定之后 xff0c 系统会为该模块中的每个 XML 布局文件生成一个绑定类 绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用 Tip xff
  • java枚举与前端的交互

    java后台与前端交互时 xff0c 如果java参数属性是枚举类型 xff0c 则交互时需要进行序列化与反序列化 当需要把枚举格式以 34 enum 34 34 code 34 34 34 34 message 34 34 34 格式返回
  • Android日志通过logcat实时输出至文件

    Android日志通过logcat实时输出至文件 一 前言二 利用logcat系统方法将日志输出到文件中 一 前言 相信在开发结束后 xff0c 开发者在开发完成后 xff0c 将apk发给测试人员 xff0c 会出现一下很尴尬的问题 测试
  • Android studio 冲突解决

    通过gradle引入依赖 xff0c 想来经常会遇见多个依赖引用重复的包 xff0c 导致项目编译不过 xff0c 以下是我遇见时的一个解决思路 一 使用task查看gradle可编译版本 gradlew task 以上代码片可查看可编译的
  • Android 使用Properties配置文件

    相信各位在进行Android开发过程中会遇见有时需要把一些配置信息保存到本地的需求 xff0c 当然Android中有SharedPreferences可以提供给我们使用 xff0c 但是知道另一种方法也不错 xff0c 是吧 以下是针对使
  • linux(adb)常用命令

    方便以后查找一下简单记录下Linux adb也适用 的常用命令 一 ls ls abc al ls指令主要用来查看目录下文件的信息 xff0c 基本格式 ls 路径 可选 指令 可选 路径默认为当前路径 xff0c 填写后为指定目录 指令
  • Android输出调试日志至文件中

    本博客讲述的是android输出日志到文件中 xff0c 不依赖于任何类 xff0c 仅需配置读写外部存储卡的权限 xff0c 可叠加输出日志文件 xff0c 可区别调试模式与正式发布版本进行选择性输出 可直接在项目中使用 下面贴上代码 代
  • WinForm使用Aspose.cells利用模板导出Excel

    Aspose是一个处理文件格式的组件 可对Words Excel等工具进行操作 实现代码数据导出 在这里我介绍以及提供Aspose对Excel Aspose Cells 导出的工具类 1 首先介绍Aspose Cells的基础知识 xff1