总结:

  • 导入文件时一定要给database设置栏位
  • 虚拟表的栏位名称可以与数据库表不一致,但顺序一定要一致,因为它是按照顺序依次插入的
  • sheet.FirstRowNum = 0; sheet.FirstCellNum = 1; getRow、getCell从0开始
  • 设置的虚拟表字段不赋值时默认为空null
  • 虚拟表字段为空时,dt.Rows[i][j].Tostring()="";

前台代码

//第一步:定义按钮

<a class="mini-button" iconcls="icon-upload" onclick="uploadExcel()">导入</a>

//第二步:定义弹出框

<div id="win" class="mini-window" title="Window"style="width:300px;height:200px;"showmodal="true">

<div id="case_0"></div>//导入所需容器

<div id="case_1"> //菜单容器

<a href="javascript:$('#file_upload').uploadify('upload', '*')">上传</a>

<a href="#">|</a>

<a href="javascript:leading_in()">导入</a>

<a href="#">|</a>

<a href="javascript:clear()">清空队列</a>

</div>

</div>

//第三步:js按钮触发事件

function onclick() {

win.setTitle("请选择上传文件");

win.show();

$("#case_0").empty();

$("#case_0").append("<input type='file' id='file_upload' />");

$("#case_1").hide();

initSendFile();

}

//第四步:初始化上传控件

var  file_name = null;

function initSendFile() {

$("#file_upload").uploadify({

'swf': '../../Scripts/uploadify-v3.1/uploadify.swf',

'uploader': '/Equipment/Upload',

buttonText: '请选择上传文件',

fileTypeExts: '*.xls;*.xlsx;',

auto: false,

multi: false,

uploadLimit: 1,

'onUploadSuccess': function (file, data, response) {

if (response == true) {

mini.alert("上传成功");

var data = mini.decode(data);

file_name = data.SaveName;

}

},

'removeCompleted': false,

'onDialogClose': function (queueData) {

if (queueData.filesQueued !='0') {

$("#repeat2").show();

}

},

'onCancel': function (file) {

$("#repeat2").hide();

}

});
}

//第五步:上传文件到服务器指定位置

public JsonResult Upload(HttpPostedFileBase fileData){
if (fileData != null)
{
try
{
string saveName = Guid.NewGuid().ToString();
string filePath = Server.MapPath("~/Uploads/UploadExcel/" + saveName);
if (!Directory.Exists(filePath)){ Directory.CreateDirectory(filePath);}
string fileName = Path.GetFileName(fileData.FileName);// 原始文件名称
string fileExtension = Path.GetExtension(fileName); // 文件扩展名
fileData.SaveAs(filePath+"\\" + saveName + fileExtension);//将fileData保存到指定路径后两个参数指定文件名
return Json(new { Success = true, FileName = fileName, SaveName = saveName },JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
LogHelper.WriteLog("EquipmentController.Upload",ex);
return Json(new { Success = false, Message = ex.Message }, JsonRequestBehavior.AllowGet);
}
}
else { return Json(new { Success = false, Message = "请选择要上传的文件!" }, JsonRequestBehavior.AllowGet); }
}

//第六步:(1)将上传到服务器的文件导入数据库-js部分

function toDB() {
$.ajax({
type: 'post',
async: false,
data: { file_name: file_name },
url: '/Equipment/toDB',
success: function (result) {
var result = mini.decode(result);
if (result.Success == true) {
mini.alert(result.Message);
win3.hide();
dg.reload();
tree.reload();
file_name = null;
} else {
mini.alert(result.Message);
}
},
error: function () {
mini.alert("导入失败!");
file_name = null;
}
});
}

//第六步:(2)将上传到服务器的文件导入数据库-控制器部分

public ActionResult toDB( string file_name )
{
if (file_name != null)
{
try
{
string filePath = Server.MapPath("~/Uploads/uploadExcel/" + file_name);
if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); }
string[] filelist = Directory.GetFiles(filePath);//将导入的文件
string fileName = Path.GetFileName(filelist[0]);//将导入的文件名称
Jxd.Mvc.Domain.Model.FileInfo filedate = new Jxd.Mvc.Domain.Model.FileInfo();
filedate.AnnexName = fileName;
filedate.AnnexPath = filePath+"\\" + fileName;
this.EquipmentService.toDB(filedate, filePath);
return Json(new { Success = true ,Message = "导入成功"},JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
LogHelper.WriteLog("ExceptionController.toDB", ex);
return Json(new { Success = false,Message = "请确保单元格内容正确!"});
}
}
else { return Json(new { Success = false, Message = "没有可导入的文件!"},JsonRequestBehavior.AllowGet); }
}

//第七步:将上传到服务器的文件导入数据库-dao层部分

public void toDB(Jxd.Mvc.Domain.Model.FileInfo filedate,string filePath)

{

try

{

//第1步:定义文件输入流

string path = filedate.AnnexPath;

FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);

//第二步:判断excel的版本,创建工作簿,工作表

string fileName = filedate.AnnexName;
       if (fileName.IndexOf(".xlsx") > 0){  workbook = new XSSFWorkbook(stream); }
       else if ( fileName.IndexOf(".xls" ) > 0) { workbook = new HSSFWorkbook(stream); }
       if (sheet == null) { sheet = workbook.GetSheetAt(0); }

//第三步:设置虚拟表栏位

DataTable dt = new DataTable();
       DataColumn field = null;

field = new DataColumn("栏位一"); dt.Columns.Add(field);

field = new DataColumn("栏位二"); dt.Columns.Add(field);

//第四步:创建字典用于渲染字段

//第五步:数据插入虚拟表

for (int i = sheet.FirstRowNum + 3; i <= sheet.LastRowNum; i++){

IRow ergodic_row = sheet.GetRow(i);

int num = ergodic_row.LastCellNum;

DataRow dataRow_1 = dt.NewRow();

dataRow_1[0] = Guid.NewGuid().ToString();

dataRow_1[1] = ergodic_row.GetCell(3).ToString();

dataRow_1[2] = ergodic_row.GetCell(8).StringCellValue;

string b = @"^[0-9]+(\\.[0-9]+)?$";

RegexStringValidator regex = new RegexStringValidator(b);

if (ergodic_row.GetCell(10) != null){

try
                  {
                      regex.Validate(ergodic_row.GetCell(10).ToString());
                      dataRow_1[13] = ergodic_row.GetCell(10).ToString();
                  }
            catch
                 {
                    continue;
                  }

}

//第六步:将虚拟表导入数据库

string connString = ConfigurationManager.AppSettings["SqlConnection"];
       SqlConnection conn = new SqlConnection(connString);
       conn.Open();
   SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(conn);
   sqlbulkcopy.DestinationTableName = "TB_BASEEQ_EQUIPMENT";
   sqlbulkcopy.NotifyAfter = dt.Rows.Count;//有几行数据
   sqlbulkcopy.WriteToServer(dt);//数据导入数据库
   sqlbulkcopy.Close();//关闭连接

if (Directory.Exists(filePath)) { Directory.Delete(filePath, true); }

}

}

catch(Exception ex){
      throw ex;
   }

}

导入excel-uploadify+npoi的更多相关文章

  1. 如何使用NPOI 导出到excel和导入excel到数据库

    近期一直在做如何将数据库的数据导出到excel和导入excel到数据库. 首先进入官网进行下载NPOI插件(http://npoi.codeplex.com/). 我用的NPOI1.2.5稳定版. 使 ...

  2. EXCEL数据导入数据库实例(NPOI)

    Default.aspx 页面代码: 引用了:    <script src="../../js/jquery.easyui.min.js" type="text/ ...

  3. ASP.NET MVC NPOI导入Excel DataTable批量导入到数据库

    使用NPOI导入Excel 首先在MVC项目中导入NPOI 查询NPOI安装,排序依据,选择:最高下载量,选择第一个. 在控制器中创建ExcelController 在Index视图中写入代码: @u ...

  4. C#语言-NPOI.dll导入Excel功能的实现

    前言:刚工作那会,公司有一套完善的MVC框架体系,每当有导入EXCEL功能要实现的时候,都会借用框架里自带的导入方法,一般三下五除二就完成了,快是快,可总是稀里糊涂的,心里很没有底.前几天,在另一个原 ...

  5. 基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能

    思路: 1.首先,页面前端,上传附件,提交给后台,并带一个随机性的参数(可以用时间戳): 2.后端接收附件,做一系列的逻辑处理,无误后,将对应的文件存储在上传的目录下: 3.然后前端,上传附件成功后, ...

  6. 使用NPOI导入Excel注意日期格式和数字格式

    //使用NPOI导入Excel public static DataTable importExcelToDataSetUsingNPOI(string FilePath, string fileNa ...

  7. 使用npoi导入Excel - 带合并单元格--附代码

    之前我们在使用npoi导入excel表格的时候,往往会遇见那种带有合并单元格的数据在导入的时候出现合并为空的问题, 也就是只有第一条有数据,其余均为空白.在网上翻了半天也没有找到合适的解决方案,最后还 ...

  8. NPOI导入excel

    1.引用NPOI: using NPOI.HSSF.UserModel;using NPOI.HSSF.Util;using NPOI.SS.UserModel; 2.导出excel 1 privat ...

  9. .Net Core 使用 NPOI 导入Excel

    由于之前在网上查阅一些资料发现总是不能编译通过,不能正常使用,现把能正常使用的代码贴出: /// <summary> /// Excel导入帮助类 /// </summary> ...

  10. [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

    引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...

随机推荐

  1. idea 远程代码调试

    声明一点:重要的事情说3遍 本地代码和服务器代码必须一致 本地代码和服务器代码必须一致 本地代码和服务器代码必须一致 第一步,创建remote 第二步.填写服务器信息 第三部.tomcat/bin/s ...

  2. 安卓 API 19 低版本设置自带的圆圈效果

    在 Android API 19 环境下,RadioButton 消除或者自定义自带的圆圈效果的形式来设置: 自定义自身选择图标 android:button="@drawable/sele ...

  3. 踩坑:VScode 集成 eslint 插件

    本文以 Vue 官方脚手架 Vue-cli 为例: 1. 创建 Vue 项目 注意:Vue-cli 默认给出了 eslint 配置,一路回车即可.最后在安装模块的时候,选择直接安装!我用淘宝镜像安装时 ...

  4. python:网络爬虫的学习笔记

    如果要爬取的内容嵌在网页源代码中的话,直接下载网页源代码再利用正则表达式来寻找就ok了.下面是个简单的例子: import urllib.request html = urllib.request.u ...

  5. excel怎么只打印某页?excel怎么只打印某几页

    有时候我们需要打印的excel文件,内容较多有好几页,而我们只需要打印里面的部分内容,为了减少纸张.碳粉的浪费,我们怎样精准打印某页或某几页呢?   工具/原料   Excel / WPS软件 方法/ ...

  6. TP框架如何绑定参数。目的进行ajax验证

    TP框架的自动绑定 对于某些操作的情况(例如模型的写入和更新方法),可以支持参数的自动绑定,例如: 首先需要开启DB_BIND_PARAM配置参数: 'DB_BIND_PARAM' => tru ...

  7. html页面元素命名参考

    页面结构: (1)页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sidebar 栏目: ...

  8. NAT地址转换常用命令详解

    缺省值:没有启用NAT. 命令模式:全局配置模式. 说明:静态NAT主要用于那些对需要对外部用户开放的服务,如Web服务器等,它可以把本地地址映射为指定的全局地址. 第一种格式实现的是一对一的NAT映 ...

  9. MonkeyRunner基本操作

    1. #导入模块; from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage 2. #连接当前设备,并返 ...

  10. pyqt5的QCompleter自动补全 使用模板

    相关说明 使用QCompleter类,就可以实现自动补全功能,效果图如下: 对应的代码很简单 def init_lineedit(self): # 增加自动补全 self.completer = QC ...