C#实现上传/下载Excel文档
要求
环境信息:WIN2008SERVER 开发工具:VS2015 开发语言:C#
要求:
1.点击同步数据后接口获取数据展示页面同时过滤无效数据并写入数据库,数据可导出Excel并支持分类导出
2.Excel导入确认数据,调用服务处理数据后写入数据库,并支持分类导出
这两天搞了一个小功能,其他的不说了针对Excel导入导出做一个小总结
导出文件
这里的文件导出是底层写好的,个人理解有限而且毕竟属于公司就不贴具体代码了,简单说一下思路
首先是建立导出Excel管理类,用于管理Excel文件导出的模板 样式 每行的计算方式等等,当然需要在项目中添加该管理类的配置文件去匹配对应模板;
1.读取对应配置文件,获取配置文件模板信息 至于模板如何配置就不说啦xml文件操作园子里面很多篇关于这个文章

2.根据XML文件定义模板id遍历查询到该模板,这里有缓存机制为了可能处于两方面考虑,1,防止频繁读取遍历文件从而减少性能缺失 2.弱误删配置文件程序不会立即停止工作,监控警报会首先暴露这个问题

3.最后就是读取指定id下面的具体导出设置,比如标题头,上限行数,给定简单默认值等等细节处理,同时也含有缓存机制

配置文件模板管理大致上有以上几种功能,下面就是具体数据库导出,还是那样不能提供具体代码但是思路可以说一说
导出管理类需要承接很多任务,入数据库查询,数据过滤,导出格式控制,导出日志设置,导出预警等等

其实这并不是一个简单的excel导出工具而是一个小型的导出平台,承接一个导出实体去设置导出的各项数据,但是还是需要开发者根据自己的需求去填写相应的模板,导出格式,数据验证,数据查询方式实体承接了导出方式
(xls或者csv等等很多格式)使用者只需要写入具体导出DB信息,以及导出表名称和配置文件以及数据验证就可以轻松使用它完成数据导出操作

并且,针对文件导出操作尤其是数据库最好由底层实现通过response流发送到页面执行下载,数据相对规整一些如果在页面直接执行导出页面有些太沉重了 毕竟这个是可以实现的
导入文件
导入文件首先需要上传,文件上传至服务器指定地址之后再去针对服务器文件解析,其实原理很简单,就是通过解析上传的文件通过OLDB方式获取解析后的文件DataSet然后在写入数据库,下面是一个上传文件格式验证

具体的读取方法就很简单了 网上一搜一大把,不过要区分一下版本而且不同版本的excel文件行数上线不同下面贴一个我常用的excel到dataset方法
public static ReturnValue ReadExcelToDataSet(string xlsFullFileName, bool isHDR, bool isIMEX, int limitSheetCount, bool isOnlyVerify)
{
ReturnValue returnValue = new ReturnValue();
string fileExt = UploadFileUtils.GetFileExt(xlsFullFileName);
if (string.IsNullOrEmpty(fileExt) || !StringUtils.IsInLimitStr("xls,xlsx", fileExt))
{
returnValue.HasError = true;
returnValue.ReturnCode = ;
returnValue.Message = "无效excel文件后缀";
return returnValue;
}
if (!File.Exists(xlsFullFileName))
{
returnValue.HasError = true;
returnValue.ReturnCode = ;
returnValue.Message = "文件不存在";
return returnValue;
}
StringBuilder stringBuilder = new StringBuilder();
string str;
if ("xlsx".Equals(fileExt, StringComparison.CurrentCultureIgnoreCase))
{
stringBuilder.Append("Provider=Microsoft.ACE.OLEDB.12.0");
str = "Excel 12.0;";
}
else
{
stringBuilder.Append("Provider=Microsoft.Jet.OLEDB.4.0");
str = "Excel 8.0;";
}
stringBuilder.Append(";Data Source=" + xlsFullFileName);
stringBuilder.Append(";Extended Properties=\"" + str);
if (isHDR)
{
stringBuilder.Append(";HDR=Yes");
}
if (isIMEX)
{
stringBuilder.Append(";IMEX=1");
}
stringBuilder.Append("\"");
ExcelUtils.log.Debug(stringBuilder.ToString());
OleDbConnection oleDbConnection = new OleDbConnection(stringBuilder.ToString());
try
{
oleDbConnection.Open();
DataTable oleDbSchemaTable = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]
{
null,
null,
null,
"Table"
});
if (oleDbSchemaTable == null || oleDbSchemaTable.Rows.Count == )
{
returnValue.HasError = true;
returnValue.ReturnCode = ;
returnValue.Message = "读取不到sheet的信息";
ReturnValue result = returnValue;
return result;
}
if (isOnlyVerify)
{
returnValue.HasError = false;
returnValue.Message = "读取sheet信息正确";
returnValue.PutValue("dtSheet", oleDbSchemaTable);
ReturnValue result = returnValue;
return result;
}
int num = oleDbSchemaTable.Rows.Count;
if (limitSheetCount > && limitSheetCount < oleDbSchemaTable.Rows.Count)
{
num = limitSheetCount;
}
string[] array = new string[num];
for (int i = ; i < num; i++)
{
array[i] = oleDbSchemaTable.Rows[i]["TABLE_NAME"].ToString();
}
DataSet dataSet = new DataSet();
for (int j = ; j < num; j++)
{
string text = "select * from [" + array[j] + "]";
ExcelUtils.log.Debug(text);
OleDbCommand selectCommand = new OleDbCommand(text, oleDbConnection);
OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter(selectCommand);
DataTable dataTable = new DataTable(array[j]);
oleDbDataAdapter.Fill(dataTable);
dataSet.Tables.Add(dataTable);
}
returnValue.HasError = false;
returnValue.PutValue("dtSheet", oleDbSchemaTable);
returnValue.PutValue("arrTableName", array);
returnValue.ReturnObject = dataSet;
returnValue.Message = "读取成功";
}
catch (Exception ex)
{
returnValue.HasError = true;
returnValue.ReturnCode = -;
returnValue.ReturnException = ex;
returnValue.Message = ex.Message;
ExcelUtils.log.WarnFormat("ReadExcelToDataSet sbConn={0} 出错,原因:{1}", stringBuilder.ToString(), ex.Message);
}
finally
{
oleDbConnection.Close();
}
return returnValue;
}
哦对 注意一下,如果用导出方法导出xls文件再用导入方法导入该文件会报错的哟,我是默认保存.csv 实际就为了确定文件是否被使用过,所以当你的excel文件能导出单相同文件却导入不了 请尝试一下重新保存一下.xls格式 在进行导入
C#实现上传/下载Excel文档的更多相关文章
- 配置允许匿名用户登录访问vsftpd服务,进行文档的上传下载、文档的新建删除等操作
centos7环境下 临时关闭防火墙 #systemctl stop firewalld 临时关闭selinux #setenforce 0 安装ftp服务 #yum install vsftpd - ...
- JAVA:借用OpenOffice将上传的Word文档转换成Html格式
为什么会想起来将上传的word文档转换成html格式呢?设想,如果一个系统需要发布在页面的文章都是来自word文档,一般会执行下面的流程:使用word打开文档,Ctrl+A,进入发布文章页面,Ctrl ...
- Java上传下载excel、解析Excel、生成Excel
在软件开发过程中难免需要批量上传与下载,生成报表保存也是常有之事,最近集团门户开发用到了Excel模版下载,Excel生成,圆满完成,对这一知识点进行整理,资源共享,有不足之处还望批评指正,文章结尾提 ...
- ASP.NET MVC下载excel文档
问题来自论坛: 很早以前,学习做asp.net练习时,就是分享过<ASP.NET MVC应用程序实现下载功能>http://www.cnblogs.com/insus/p/3615714. ...
- asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文
近公司项目上在开发微信服务号的接口,需要给用户回复图片或语音或视频,这个时候就需要用到 上传下载多媒体文件接口,微信在这方面推荐采用的是开源函数库curl实现的,CURL项目包括很多版本,我主要测试的 ...
- 使用phpexcel上传下载excel文件
1. 下载 <?php /** * Created by lonm.shi. * Date: 2012-02-09 * Time: 下午4:54 * To change this templat ...
- Oracle PL/SQL Developer 上传下载Excel
接到需求,Oracle数据库对Excel数据进行上传和下载,百度后没有很全的方案,整理搜到的资料,以备不时之需. 一.下载Oracle数据到Excel中. 下载数据到Excel在MSSql中很简单,直 ...
- .net core webapi 文件上传在 Swagger 文档中的有好提示处理
前提: 需要nuget Swashbuckle.AspNetCore 我暂时用的是 4.01 最新版本: 描述:解决 .net core webapi 上传文件使用的是 IFormFile,在S ...
- SharePoint2013 上传文件到文档库
SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite site = new SPSite(SPContext.Current. ...
随机推荐
- python模块之openpyxl
这是一个第三方库,可以处理xlsx格式的Excel文件.pip install openpyxl安装.如果使用Aanconda,应该自带了. 读取Excel文件 需要导入相关函数. from open ...
- 解决pyspider框架web预览框过小问题
解决pyspider框架web预览框过小问题 Chrome 使用pyspider框架时,web预览框只有一小条: 解决办法: 找到debug.min.css文件,替换为如下内容: body{margi ...
- js 简单的滑动4
js 简单的滑动教程(四) 作者:Lellansin 转载请标明出处,谢谢 在大概的了解滑动的基本原理和怎么去实现之后,现在我们将更深入的去讨论js的滑动. 相信细心的朋友应该已经发现了,在本教程 ...
- Java调用WebService方法总结(7)--CXF调用WebService
CXF = Celtix + XFire,继承了Celtix和XFire两大开源项目的精华,是一个开源的,全功能的,容易使用的WebService框架.文中所使用到的软件版本:Java 1.8.0_1 ...
- 定时任务 Quarzt
Quartz.Net是一个从java版的Quartz移植过来的定时任务框架,可以实现异常灵活的定时任务. Quartz 有三个概念分别是 计划者(ISchedeler).工作(IJob).触发器(Tr ...
- 关于阿里 iconfont 的使用步骤
第一步: 在iconfont库中,找到你想要的图标,加入到购物车,再在购物车中将图标加入到你的项目中去 第二步: 在项目中,可以看到刚刚加入的图标,这里是你在项目中所有用到的iconfont,选 ...
- Linux 基础学习2
目录 Linux 基础学习2 文件目录结构 文件命名规范 文件系统结构 linux应用程序的组成 绝对路径和相对路径 目录名和基名 切换目录 切换到家目录 切换到上一次的目录 显示当前的工作目录 列出 ...
- SSM框架之MyBatis入门介绍
一.什么是MyBatis? MyBatis源自Apache的iBatis开源项目, 从iBatis3.x开始正式更名为MyBatis.它是一个优秀的持久层框架. 二.为什么使用MyBatis? 为了和 ...
- kafka原理与组件
一.什么是kafkakafka的目标是实现一个为处理实时数据提供一个统一.高吞吐.低延迟的平台.是分布式发布-订阅消息系统,是一个分布式的,可划分的,冗余备份的持久性的日志服务.Kafka使用场景:1 ...
- python之文件的相关操作
一..文件操作的函数 open("文件名(路径)" ,mode = "模式" , encoding="字符集") 注:文件路径: (1)绝对 ...