C#实现文件上传下载Excel文档示例代码

作者:流年过往 时间:2023-01-09 20:53:23 

要求

环境信息:WIN2008SERVER  开发工具:VS2015 开发语言:C#

要求:

  1.点击同步数据后接口获取数据展示页面同时过滤无效数据并写入数据库,数据可导出Excel并支持分类导出

  2.Excel导入确认数据,调用服务处理数据后写入数据库,并支持分类导出

这两天搞了一个小功能,其他的不说了针对Excel导入导出做一个小总结

导出文件

这里的文件导出是底层写好的,个人理解有限而且毕竟属于公司就不贴具体代码了,简单说一下思路

首先是建立导出Excel管理类,用于管理Excel文件导出的模板 样式 每行的计算方式等等,当然需要在项目中添加该管理类的配置文件去匹配对应模板;

1.读取对应配置文件,获取配置文件模板信息 至于模板如何配置就不说啦xml文件操作园子里面很多篇关于这个文章

C#实现文件上传下载Excel文档示例代码

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

C#实现文件上传下载Excel文档示例代码

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

C#实现文件上传下载Excel文档示例代码

配置文件模板管理大致上有以上几种功能,下面就是具体数据库导出,还是那样不能提供具体代码但是思路可以说一说

导出管理类需要承接很多任务,入数据库查询,数据过滤,导出格式控制,导出日志设置,导出预警等等

C#实现文件上传下载Excel文档示例代码

其实这并不是一个简单的excel导出工具而是一个小型的导出平台,承接一个导出实体去设置导出的各项数据,但是还是需要开发者根据自己的需求去填写相应的模板,导出格式,数据验证,数据查询方式实体承接了导出方式

(xls或者csv等等很多格式)使用者只需要写入具体导出DB信息,以及导出表名称和配置文件以及数据验证就可以轻松使用它完成数据导出操作

C#实现文件上传下载Excel文档示例代码

并且,针对文件导出操作尤其是数据库最好由底层实现通过response流发送到页面执行下载,数据相对规整一些如果在页面直接执行导出页面有些太沉重了 毕竟这个是可以实现的

导入文件

 导入文件首先需要上传,文件上传至服务器指定地址之后再去针对服务器文件解析,其实原理很简单,就是通过解析上传的文件通过OLDB方式获取解析后的文件DataSet然后在写入数据库,下面是一个上传文件格式验证

C#实现文件上传下载Excel文档示例代码

具体的读取方法就很简单了 网上一搜一大把,不过要区分一下版本而且不同版本的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 = 1;
 returnValue.Message = "无效excel文件后缀";
 return returnValue;
}
if (!File.Exists(xlsFullFileName))
{
 returnValue.HasError = true;
 returnValue.ReturnCode = 2;
 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 == 0)
 {
  returnValue.HasError = true;
  returnValue.ReturnCode = 3;
  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 > 0 && limitSheetCount < oleDbSchemaTable.Rows.Count)
 {
  num = limitSheetCount;
 }
 string[] array = new string[num];
 for (int i = 0; i < num; i++)
 {
  array[i] = oleDbSchemaTable.Rows[i]["TABLE_NAME"].ToString();
 }
 DataSet dataSet = new DataSet();
 for (int j = 0; 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 = -100;
 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格式 在进行导入

来源:http://www.cnblogs.com/workstation-liunianguowang/p/6606104.html

标签:c#,文件上传,文件下载
0
投稿

猜你喜欢

  • Winform让DataGridView左侧显示图片

    2021-09-24 03:50:38
  • java精度计算代码 java指定精确小数位

    2023-07-31 03:03:58
  • java音乐播放器编写源码

    2022-08-02 21:06:44
  • 一文详解Spring是怎么读取配置Xml文件的

    2023-07-30 00:27:37
  • java算法之Math.random()随机概率玩法实例演示

    2023-11-28 23:32:17
  • SpringBoot自动装配之Condition深入讲解

    2023-12-03 02:20:29
  • SpringBoot如何优雅的处理全局异常

    2021-06-09 21:28:13
  • Java 如何将网络资源url转化为File文件

    2023-05-28 09:23:37
  • C# char类型字符转换大小写的实现代码

    2021-07-27 19:21:09
  • Android SharedPreferences存储用法详解

    2023-08-07 08:25:34
  • java自带的MessageDigest实现文本的md5加密算法

    2023-10-08 03:35:29
  • idea搭建SSM框架遇踩的坑(附完整过程)

    2023-06-23 09:53:07
  • 如何使用Spring AOP的通知类型及创建通知

    2022-03-19 19:32:51
  • jdbc和mybatis的流式查询使用方法

    2023-08-24 15:39:25
  • Spring Boot 2.X快速整合jpa过程解析

    2021-09-22 15:27:29
  • 如何利用java控制鼠标操作一些重复的事情

    2021-11-12 12:54:02
  • MyEclipse2018中安装Mybatis generator插件的实现步骤

    2022-02-17 03:47:37
  • java线程池:获取运行线程数并控制线程启动速度的方法

    2022-06-30 23:22:57
  • 合成聚合复用原则_动力节点Java学院整理

    2023-06-27 22:05:20
  • Java结构型设计模式之享元模式示例详解

    2022-05-16 21:41:10
  • asp之家 软件编程 m.aspxhome.com