asp.net使用组件koogra读取Excel数据批量上传导入

news/2024/7/21 7:40:05 标签: excel, asp.net, stream, string, path, 工作

 

本文使用.NET开源组件koogra实现读取excel内容批量上传,在企业应用中经常会遇到批量上传数据的需求,客户要求使用excel表格录入一批数据,然后通过网页上传该excel表格,实现批量导入数据。这样的需求其实主要就是处理Excel表格,把Excel表格中的内容读取出来后,做一些必要的校验,然后上传校验成功的数据,返回失败数据的行号以及校验失败的信息。

 

koogra项目组件下载地址:

 

http://sourceforge.net/projects/koogra/

 

下面开始我们的封装过程,为了好用我希望的方式是四种,返回的结果都是DataTable对象。

 

1:传入的参数包括工作簿地址、工作表名称;

 

2:传入的参数包括工作簿地址、工作表的索引(0表示第一个工作表);

 

3:传入的参数包括内存流、工作表名称;

 

4:传入的参数包括内存流、工作表的索引(0表示第一个工作表)。

 

开始上代码,记得项目要引用Ionic.Utils.Zip.dll和Net.SourceForge.Koogra.dll

 


 Code  [http://www.oeedu.com]


   
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using Net.SourceForge.Koogra.Excel;

namespace Gren.Framework.Office
{
/// <summary>
/// Excel工具类
/// </summary>
public class ExcelUtils
{
private Workbook book;

public ExcelUtils( string path)
{
this .book = new Workbook(path);
}

public ExcelUtils(System.IO.Stream stream)
{
this .book = new Workbook(stream);
}

protected DataTable SaveAsDataTable(Worksheet sheet)
{
DataTable dt = new DataTable();

uint minRow = sheet.Rows.MinRow;
uint maxRow = sheet.Rows.MaxRow;

Row firstRow = sheet.Rows[minRow];

uint minCol = firstRow.Cells.MinCol;
uint maxCol = firstRow.Cells.MaxCol;

for ( uint i = minCol; i <= maxCol; i )
{
dt.Columns.Add(firstRow.Cells[i].FormattedValue());
}

for ( uint i = minRow 1 ; i <= maxRow; i )
{
Row row = sheet.Rows[i];

if (row != null )
{
DataRow dr = dt.NewRow();

for ( uint j = minCol; j <= maxCol; j )
{
Cell cell = row.Cells[j];

if (cell != null )
{
dr[Convert.ToInt32(j)] = cell.Value != null ? cell.Value.ToString() : string .Empty;
}
}

dt.Rows.Add(dr);
}

}

return dt;
}

public DataTable ToDataTable( int index)
{
Worksheet sheet = this .book.Sheets[index];

if (sheet == null )
{
throw new ApplicationException( string .Format( " 索引[{0}]所指定的电子表格不存在! " , index));
}

return this .SaveAsDataTable(sheet);
}

public DataTable ToDataTable( string sheetName)
{
Worksheet sheet = this .book.Sheets.GetByName(sheetName);

if (sheet == null )
{
throw new ApplicationException( string .Format( " 名称[{0}]所指定的电子表格不存在! " , sheetName));
}

return this .SaveAsDataTable(sheet);
}

#region 静态方法

/// <summary>
/// 单元格格式为日期时间,使用此方法转换为DateTime类型,若解析失败则返回‘0001-01-01’
/// </summary>
public static DateTime ParseDateTime( string cellValue)
{
DateTime date = default (DateTime);

double value = default ( double );

if ( double .TryParse(cellValue, out value))
{
date = DateTime.FromOADate(value);
}
else
{
DateTime.TryParse(cellValue, out date);
}

return date;
}

/// <summary>
/// 转换为DataTable(文件路径 表名)
/// </summary>
public static DataTable TranslateToTable( string path, string sheetName)
{
ExcelUtils utils = new ExcelUtils(path);
return utils.ToDataTable(sheetName);
}

/// <summary>
/// 转换为DataTable(文件路径 表索引)
/// </summary>
public static DataTable TranslateToTable( string path, int sheetIndex)
{
ExcelUtils utils = new ExcelUtils(path);
return utils.ToDataTable(sheetIndex);
}

/// <summary>
/// 转换为DataTable(文件路径)
/// </summary>
public static DataTable TranslateToTable( string path)
{
ExcelUtils utils = new ExcelUtils(path);
return utils.ToDataTable( 0 );
}

/// <summary>
/// 转换为DataTable(内存流 表名)
/// </summary>
public static DataTable TranslateToTable(System.IO.Stream stream, string sheetName)
{
ExcelUtils utils = new ExcelUtils(stream);
return utils.ToDataTable(sheetName);
}

/// <summary>
/// 转换为DataTable(内存流 表索引)
/// </summary>
public static DataTable TranslateToTable(System.IO.Stream stream, int sheetIndex)
{
ExcelUtils utils = new ExcelUtils(stream);
return utils.ToDataTable(sheetIndex);
}

/// <summary>
/// 转换为DataTable(内存流)
/// </summary>
public static DataTable TranslateToTable(System.IO.Stream stream)
{
ExcelUtils utils = new ExcelUtils(stream);
return utils.ToDataTable( 0 );
}

#endregion
}
}

 

ParseDateTime这个静态方法是用来处理日期时间类型单元格的,在Excel表格里面日期时间类型读取出来的时候是一个double类型的数据,使用这个方法可以得到正确的DataTime类型的值。仔细的人可以发现这个方法其实除了把double类型的数据转换为DateTime之外,还会在转换失败的时候尝试把该单元格的内容做为字符串转换为DateTime,因为如果单元格是文本类型的话,那么用户输入的日期时间就不是一个double了。

 

好了,读取Excel的类就封装好了,那么在asp.net页面中如何使用呢?再看下面的代码,fileUpload1是文件上传控件。

 

 

 


 Code  [http://www.oeedu.com]


   
if (fileUpload1.HasFile)
{
DataTable dt = null ;

try
{
using (System.IO.MemoryStream stream = new System.IO.MemoryStream(fileUpload1.FileBytes))
{
dt = Gren.Framework.Office.ExcelUtils.TranslateToTable(stream, " sheet1 " );
}

// 得到DataTable对象后,做你自己的处理
}
catch (Exception ex)
{
lblMessage.Text = " <p><span class=/"c_red ft_bold/">处理数据文件错误:</span></p> " ;
lblMessage.Text = " <div class=/"c_red/"> " Server.HtmlEncode(ex.Message) " </div> " ;
}
}
else
{
lblMessage.Text = " <p><span class=/"c_red ft_bold/">请选择数据文件</span></p> " ;
}

 

直接用内存流来处理上传的文件还是比较快的,大家试试吧.

 


http://www.niftyadmin.cn/n/1411795.html

相关文章

Linux入门(4)- Linux自启动脚本(以自启动Java应用为例)

通常我们部署到Linux上的系统&#xff0c;都需要设置自启动&#xff0c;而Linux自启动的方式有很多种&#xff0c;比如 通过&#xff08;init.d&#xff09;服务的方式自启动 、 通过systemctl 服务的方式自启动 等等 这里介绍一下 通过&#xff08;init.d&#xff09;服务的方…

Linux下制作U盘系统启动盘的方法

为什么80%的码农都做不了架构师&#xff1f;>>> 一、cat 我们都知道这只 “猫” 在Linux下可是相当有名&#xff0c;而且使用频率也很高&#xff0c;那么你知道可以使用它来制作U盘启动盘么&#xff1f;其实我上面说了&#xff0c;只需要一条命令…… cat ubuntu-1…

在spring Boot中使用swagger-bootstrap-ui(原文)

1.swagger简介 Swagger是一个API接口管理工具&#xff0c;支持在线测试接口数据&#xff0c;根据配置自动生成API文档&#xff0c;结合spring mvc而提供界面化方法文档的一个开源框架。1.1Swagger主要的项目Swagger是一组开源项目&#xff0c;主要项目如下&#xff1a;Swagger-…

纯CSS实现网站常用的五角星评分和分数展示交互效果

最近做的一个项目涉及到评分和展示分数的模块&#xff0c;UI设计师也给了几个切好的图片&#xff0c;实现五角星评分方式很多&#xff0c;本质爱折腾的精神和对性能追求以及便于维护的考虑&#xff0c;搜集和尝试了很多方式&#xff0c;最终采用了纯css驱动的实现方式完成评分和…

windows下react-native环境配置

react-native环境搭建是一个比较麻烦的过程&#xff0c;主要分为windows和mac两种操作系统。在这两种操作系统上使用JavaScript语言达到android开发和ios开发的效果。 想要弄明白为什么要这样搭建开发环境&#xff0c;就要搞明白使用JavaScript开发媲美原生app的原理---利用Ja…

Linux入门(5)- 安装JDK

1、CentOS 7 安装好之后&#xff0c;系统默认自带了OpenJDK版本信息&#xff0c;如果只是想运行 .jar 程序&#xff0c;可以不用自己再安装 JDK 2、下载 jdk-xxxx-linux-x64.rpm 3、卸载系统自带 java java -version # 如果有结果出来&#xff0c;则说明自带了java r…

Hibernate5-1对多(1:n)-fetch=join

1.创建项目,项目名称hibernatedemo22,目录结构如图所示2.在项目中创建lib目录存储jar文件,目录结构如图所示3.在src目录中创建实体类Forum,包名(com.mycompany.demo.bean),如图所示4.实体类Forum的内容如下package com.mycompany.demo.bean;import java.util.Set;public class …

pyQt点击事件和数据传输

首先是PushButton点击事件&#xff0c;点击按钮之后发送textEdit框里输入的文字到后台。 1 def retranslateUi(self, MainWindow):2 _translate QtCore.QCoreApplication.translate3 MainWindow.setWindowTitle(_translate("MainWindow", "Ma…