Excel通过POI大数据导入数据库通用方案
如何把Excel工作表中数据导入数据库
如何把Excel工作表中数据导入数据库如何把Excel工作表中数据导入数据库大家知道要如何把Excel工作表中数据导入数据库呢?有什么方法呢?下面一起来看看!我想至少有这样两种比较容易实现的方法:1、直接用Sql语句查询2、先用excle中的数据生成xml文件,再把xml导入数据库第一种方法(方法二以后再试),找到联机丛书里实现此功能的Sql 语句如下:SELECT* FROMOpenDataSource('Microsoft.Jet.OLEDB.4.0', 'DataSource="c:Financeaccount.xls";UserID=Admin;Password=;E xtendedproperties=Excel5.0')…xactions语句是有了,但我还是试了很久,因为各个参数具体该怎么设置它没有说。
Data Source就是excel文件的路径,这个简单;UserId、Password和Extended properties这三个属性我改成了各种各样的与本机有关的用户名、密码以及excel版本都不对,最后用上面例子里的.值“User ID=Admin;Password=;Extended properties=Excel 5.0”才成功了,晕啊;最后个“xactions”更是查了很多资料,其实就仅仅是excel文件里所选的工作表名而已,怪我对excel不够熟悉了,另外注意默认的Sheet1要写成[Sheet1$]最后,看看我成功的测试数据库里建好一个表testTable_1,有5个字段id, name, date, money, content,C盘下book1.xls文件的sheet1工作表里写好对应的数据并设好数据类型,执行如下插入语句:intotestTable_1([name],[date],[money],[content]) Select[姓名],[日期],[金额],[内容] FROMOpenDataSource('Microsoft.Jet.OLEDB.4.0','DataSource="C:Book1.xls";UserID=Admin;Password=;Extendedproperties=Excel5.0')…[Sheet1$]select里的列名我一开始用*代替,但发现输出顺序与我预期的不同,是“金额、内容、日期、姓名”,不知道具体有什么规律,就老老实实写名字了。
把Excel数据导入到数据库的方法
把Excel数据导入到数据库的方法Excel是一个办公很经常用到的一个办公软件,他主要用于数据的分析、查看、对比等,让数据看起来更直观,更容易对比,而有很多时候都会需要把Excel的数据导入到数据库里面,所以今天小编为大家带来了有关于Excel导入到数据库的方法供大家使用、学习。
把Excel数据导入到数据库的方法,步骤如下:Excel导入数据库步骤一:打开SQL Server Management Studio,按图中的路径进入导入数据界面。
Excel导入数据库步骤二:导入的时候需要将EXCEL的文件准备好,不能打开。
点击下一步。
Excel导入数据库步骤三:数据源:选择“Microsoft Excel”除了EXCEL类型的数据,SQL还支持很多其它数据源类型。
Excel导入数据库步骤四:选择需要导入的EXCEL文件。
点击浏览,找到导入的文件确定。
Excel导入数据库步骤五:再次确认文件路径没有问题,点击下一步。
Excel导入数据库步骤六:默认为是使用的WINODWS身份验证,改为使用SQL身份验证。
输入数据库密码,注意:数据库,这里看看是不是导入的数据库。
也可以在这里临时改变,选择其它数据库。
Excel导入数据库步骤七:选择导入数据EXCEL表内容范围,若有几个SHEET表,或一个SHEET表中有些数据我们不想导入,则可以编写查询指定的数据进行导入。
点击下一步。
Excel导入数据库步骤八:选择我们需要导入的SHEET表,比如我在这里将SHEET表名改为price,则导入后生面的SQL数据库表为price$。
点击进入下一步。
Excel导入数据库步骤九:点击进入下一步。
Excel导入数据库步骤十:在这里完整显示了我们的导入的信息,执行内容,再次确认无误后,点击完成,开始执行。
Excel导入数据库步骤十一:可以看到任务执行的过程和进度。
Excel导入数据库步骤十二:执行成功:我们可以看看执行结果,已传输1754行,表示从EXCEL表中导入1754条数据,包括列名标题。
poi根据excel模板文件导出数据
poi根据excel模板文件导出数据Poi是一款用于操作Microsoft Office文件(如Excel、Word和PowerPoint)的Java库。
它提供了丰富的API,使开发人员可以读取、创建和修改这些文件。
在本文中,我们将讨论如何使用Poi库根据Excel 模板文件导出数据。
首先,我们需要在项目中导入Poi库的依赖项。
你可以在Maven或Gradle中添加以下依赖项:Maven:```xml<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>```Gradle:```implementation 'org.apache.poi:poi:4.1.2'implementation 'org.apache.poi:poi-ooxml:4.1.2'```接下来,我们需要加载Excel模板文件。
假设我们有一个名为"template.xlsx"的Excel模板文件,其中包含我们想要导出数据的工作表。
我们可以通过以下代码加载模板文件:```javaFileInputStream fis = new FileInputStream("template.xlsx");Workbook workbook = new XSSFWorkbook(fis);Sheet sheet = workbook.getSheetAt(0); // 假设我们要操作的是第一个工作表```现在我们已经加载了模板文件,接下来我们需要根据Excel模板填充数据。
一种高效的excel表导入数据库的实现方法
一种高效的 Excel 表导入数据库的实现方法在企业或个人日常工作中,经常需要将 Excel 表格中的数据导入到数据库中。
本文介绍了一种高效的 Excel 表导入数据库的实现方法,该方法可以大大提高数据导入的速度和准确性。
下面是本店铺为大家精心编写的3篇《一种高效的 Excel 表导入数据库的实现方法》,供大家借鉴与参考,希望对大家有所帮助。
《一种高效的 Excel 表导入数据库的实现方法》篇1引言在企业或个人日常工作中,经常需要将 Excel 表格中的数据导入到数据库中。
通常情况下,这种导入需要手动执行,即通过编写 SQL 语句或将数据复制粘贴到数据库管理系统中完成。
这种方法费时费力,且容易出错。
因此,本文介绍了一种高效的 Excel 表导入数据库的实现方法,以提高数据导入的速度和准确性。
实现方法该实现方法主要包括以下步骤:1. 创建一个 Excel 表格,并将需要导入的数据添加到该表格中。
2. 使用 Excel 的“数据”选项卡中的“获取数据”功能,将 Excel 表格中的数据连接到数据库中。
这一步可以使用 Excel 自带的连接器或者使用第三方连接器。
3. 在 Excel 中创建一个新的工作表,并将需要导入的数据添加到该工作表中。
4. 使用 Excel 的“数据”选项卡中的“从其他源导入”功能,将数据从 Excel 工作表中导入到数据库中。
这一步可以使用 Excel 自带的导入器或者使用第三方导入器。
5. 在数据库中创建一个新的表,并将导入的数据添加到该表中。
6. 对导入的数据进行验证和清洗,以确保数据的准确性和完整性。
7. 执行 SQL 语句,将导入的数据保存到数据库中。
优点该实现方法具有以下优点:1. 高效。
该方法可以大大提高数据导入的速度,节省人力和时间成本。
2. 准确。
该方法可以确保导入的数据准确无误,避免数据错误导致的后续问题。
3. 灵活。
该方法可以支持多种数据库类型,如 MySQL、Oracle 等。
【原创】POI操作Excel导入导出工具类ExcelUtil
【原创】POI操作Excel导⼊导出⼯具类ExcelUtil关于本类线程安全性的解释:多数⼯具⽅法不涉及共享变量问题,⾄于添加合并单元格⽅法addMergeArea,使⽤ThreadLocal变量存储合并数据,ThreadLocal内部借⽤Thread.ThreadLocalMap以当前ThreadLocal为key进⾏存储,设置⼀次变量,则其他线程也会有上次数据的残留,因此在addMergeArea⽅法中进⾏清空的操作。
为了保证原⼦性, 采⽤ReentrantLock确保⼀次只有⼀个线程可以进⾏添加合并数据的操作。
线程安全性从以上两个⽅⾯保证。
⽔平有限,难免会有疏漏,敬请谅解。
主要使⽤Apache POI进⾏Excel的导⼊、导出使⽤读取Excel中的数据原始数据如下:⽅法:public static List<List<String>> readFile(InputStream ins, int headRowNum) throws Exception使⽤⽅式:String filePath = "excel⽂件路径";File file = new File(filePath);InputStream ins = new FileInputStream(file);List<List<String>> lists = ExcelUtil.readFile(ins, 2);System.out.println(lists);返回结果:[[序号, 部门, 姓名, 上岗证号, 岗职, ⼊职时间], [, , , , , ], [1, 财务部, 赵六, 001, 出纳, 1540915200000], [1, 财务部, 张三, 002, 会计, 1517328000000]]注:对于Date类型,读取时读的是long类型参数将Excel中的数据转换为对应的实体Entitypublic static <T> List<T> getListFromExcel(InputStream ins, int headRowNum, Class<T> cls, int parseIndex, String... excludeAttr) throws Exceptionpublic static <T> List<T> getListFromExcel(MultipartFile file, int headRowNum, Class<T> cls, int parseIndex, String... excludeAttr) throws Exception两种⽅法本质上没有什么区别,可变参数excludeAttr配置实体不匹配的属性,例如:id注:转换的时候,需要保证excel中属性的顺序与实体中属性的顺序对应,例如excel中部门-姓名-上岗证号...这样,则实体也应该按照这样的顺序定义属性。
excel的大数据量用POI读取
excel的大数据量用POI读取
昨天刚解决了POI的大数据量写,今天又碰到一个问题,客户把50万的数据用excel传了过来T.T
普通的读取依然会OOM
无奈继续查资料。
记得看到一篇文章上说XSSF默认用DOM解析XML的,那必然会OOM了,于是开始找用SAX读的例子,找到了应该比较经典的FromHowTo.java(/repos/asf/poi/trunk/src/examples/src/org/apa che/poi/xssf/eventusermodel/examples/FromHowTo.java)
用这个例子还是碰到了挺多问题
1. 写入的逻辑会嵌入到这个读取里..它并没有提供比较友好的getRow之类的一行一行处理的方法..导致我的代码写地很猥琐..
2. SharedStringsTable sst = r.getSharedStringsTable();这段代码依然会抛OOM. 看提问频道有一个哥们也碰到了同样的问题..都已经用SAX解析了还是OOM是挺尴尬的..目前的解决方法是开大了一些内存..- -..简单有效..基本上代码跑过了这行以后的读取就不怕OOM了..。
Excel表格导入数据库步骤说明
Excel表格导入数据库步骤说明
1.右键所要导入数据的“表”,点击“导入向导”
2.选择excel作为导入数据格式,并浏览选择对应想导入的excel表格和要导入的对应的分表,操作完成后点击下一步。
3.栏位名称为数据库字段名,根据具体表格而定,第一个数据行为数据库表格中第一行有效数据对应的excel行号,最后一个数据行可以不设定,如果设定,则为最后一个有效数据对应的行号。
4.在第4/8步时点击下一步旁边的“>>”按钮后再点击上一步来到第7/8步,选择一个导入模式,如果进入5/8,6/8界面中进行修改,会影响数据库结构。
5.点击开始,根据提示信息判断是否导入成功,处理项目是否缺失等,成功后点击关闭完成导入。
导入成功后,开始按钮仍然可以点击,再次点击会导致重复导入,会有信息重复的提示信息。
Java解析Excel文件并把数据存入数据库
Java解析Excel⽂件并把数据存⼊数据库前段时间做⼀个⼩项⽬,为了同时存储多条数据,其中有⼀个功能是解析Excel并把其中的数据存⼊对应数据库中。
花了两天时间,不过⼀天多是因为⽤了"upload"关键字作为URL从⽽导致总报同⼀个错,最后在同学的帮助下顺利解决,下⾯我把⾃⼰⽤"POI"解析的⽅法总结出来供⼤家参考(我⽤的是SpingMVC和hibernate框架)。
1.web.xml中的配置⽂件web.xml中的配置⽂件就按照这种⽅式写,只需要把"application.xml"换成你的配置⽂件名即可<!--⽂件上传对应的配置⽂件--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:application.xml</param-value></context-param>2.application.xml的配置⽂件(固定写发)在这个配置⽂件中你还可以规定上传⽂件的格式以及⼤⼩等多种属性限制<!-- 定义⽂件上传解析器 --><bean id="multipartResolver"class="monsMultipartResolver"></bean>3.⽂件上传的前端HTML注意:1.enctype="multipart/form-data" 必须写,封装表单2.method="post",提交⽅式必须为"post"提交3.action="${text}/uploadfile", "uploadfile"切记不要写成"upload",否则你找到世界末⽇也不会找到哪⾥有问题(本⼈因为这个折腾了⼀天多时间)。
如何实现Excel表格自动导入到数据库
如何实现Excel表格自动导入到数据库如何实现Excel表格自动导入到数据库2010-05-03 23:46目前人们在存储统计数据时大多都会采用Office的Excel,因为Excel做的表格确实很好用,又简单又方便。
而Excel软件本身的功能也很强大,除了本身自带的一些对表格数据的处理功能外还允许我们自己编写脚本程序,实现自定义的功能。
但是随着信息化建设步伐的加快,网络化办公环境对数据处理的新方式势必要取代一个个Excel文件和层层嵌套的文件夹的传统方式。
而在信息化建设的过程中对已有数据的保存和利用是非常重要的,如何将现有的各种数据存储方式中的数据录入到数据库中,从而为信息化平台服务呢?我们不可能让用户一条条地向数据库里录入数据,因为这很不现实,所以我们要通过程序实现批量录入,或者是直接导入。
我是利用了JXL接口实现了Excel文件导入这个功能,它可以自动把Excel文件中的数据导入到数据库中相应的表里。
而且我把它做成了公共接口,通过配置文件的配置就可以"一次编写,多处运用"。
1.首先需要有jxl的jar包,这个可以在网上下到,解压后把jxl.jar、jxl-2.6.jar、classes12.jar放到工程里。
2.编写类文件,因为Excel表格数据的导入是分三步,首先将Excel文件上传到服务器中,然后将数据读取导入至数据库,最后再将Excel文件删掉。
所以要写两个类,一个实现上传,一个实现读取数据。
上传部分请看我的另一篇关于上传的日志,此处我只介绍读取数据的类,名字为ExcelInAction.java。
内容如下:package com.xdsc.util;import java.io.*;import java.sql.Connection;importjava.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;importcom.xdsc.util.UploadAction;import jxl.*;public class ExcelInAction extends ActionSupport{//static String createTableSql="";//创建数据库的sql static String colType="varchar";//字段类型static String key="id";//主键static String charSet="utf8";//表格字符类型static String ENGINE="InnoDB";//表格类型static String tableName;//表名称static String tableValue;//表属性static String colName="col";//默认字段名static Connection conn=null;/*Excel表格导入数据库需要先将Excel文件上传*/private File file;//封装上传文件private String fileContentType;//封装上传文件类型private String fileFileName;//封装上传文件名private String savePath;//封装上传文件保存路径private String path;//自定义上传文件路径值public String execute()throws Exception{try{UploadAction ua=new UploadAction();//创建上传Action的对象/*配置UploadAction的各项参数*/ua.setPath(path);ua.setFile(file);ua.setFileContentType(fileContentType);ua.setFileFileName(fileFileName);ua.setSavePath(getSavePath());ua.execute();//构建Workbook对象,只读Workbook对象//直接从本地文件创建Workbook//从输入流创建Workbook System.out.println("start loadfile---");InputStream is=newFileInputStream(ua.getSavePath()+"\"+ua.getFileFileName());//创建输入流Workbook rwb=Workbook.getWorkbook(is);Sheet rs=rwb.getSheet(0);//读取第一个sheet int colNum=rs.getColumns();//列数introwNum=rs.getRows();//行数System.out.println("colNum rowNum--"+rowNum+"行,"+colNum+"列+");System.out.println("start create base---");getConntion();//建立数据库连接String sql=getColName(rowNum,colNum);PreparedStatement ps=null;String strValue="";ps=conn.prepareStatement(sql);System.out.println(sql);for(int i=1;i rowNum;i++){strValue="";for(int j=0;j colNum;j++){Cell c=rs.getCell(j,i);strValue=c.getContents();ps.setString(j+1,strValue);}ps.addBatch();}ps.executeBatch();//mit();if(ps!=null){ps.close();}System.out.println("insert end---");close();}catch(Exception e){e.printStackTrace();}return SUCCESS;}static String getColName(int rowNum,int colNum){//可以做成可配置文件String colSql="";String colValue="";for(int j=0;j colNum;j++){colSql=colSql+"'"+colName+j+"',";colValue=colValue+""+"?,";}return"insertinto"+tableName+"("+tableValue+")"+"values("+colValue.substring(0,col stIndexOf(","))+");";}static void getConntion(){try{String driver_class="com.mysql.jdbc.Driver";String connection_url="jdbc:mysql://localhost:3306/software_infoplatform?useUnicode=true&characterEncoding=utf-8";String user_name="root";String db_password="xdsc";Class.forName(driver_class);conn=DriverManager.getConnection(connection_url,user_name,db_password );}catch(Exception e){e.printStackTrace();}}static void close(){if(conn!=null){try{conn.close();}catch(SQLException e){//TODO Auto-generated catch block e.printStackTrace();}}}/*各变量相应的get,set方法*/public File getFile(){return file;}public void setFile(File file){this.file=file;}public String getFileContentType(){return fileContentType;}public void setFileContentType(StringfileContentType){this.fileContentType=fileContentType;}public String getFileFileName(){return fileFileName;}public void setFileFileName(StringfileFileName){this.fileFileName=fileFileName;}public String getSavePath(){HttpServletRequestrequest=ServletActionContext.getRequest();returnrequest.getRealPath(savePath);}public void setSavePath(String savePath){this.savePath=savePath;}public String getPath(){return path;}public void setPath(String path){this.path=path;}public void setTableName(StringtableName){this.tableName=tableName;}public void setTableValue(StringtableValue){this.tableValue=tableValue;}}3.在struts配置文件中做配置:actionname="excelIn"class="com.xdsc.util.ExcelInAction"!-path指定的是上传文件的地址paramname="path"/WEB-INF/classes/upfile/param paramname="tableName"tab_course/paramparamname="tableValue"f_CourseNumber,f_CourseName,f_CourseScore,f_CourseXueShi/param resultname="success"/ExcelInSuccess.jsp/resultresultname="fail"/registerFail.jsp/result/action 4.编写jsp功能页面:%@page language="java"import="java.util.*"pageEncoding="UTF-8"%%String path=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%html head base href="%=basePath%"title Excel表格内容导入数据库测试页面/title/head body formaction="excelIn.action"enctype="multipart/form-data"method="post"请按如下格式排版excel的列字段(以表1:tab_course课程表为例):br br课程编号|课程名|学分|学时br br导入excel文件:br inputtype="file"name="file"/br input type="submit"value="导入"/br/form/body/html然后就可以用了。
如何把excel导入数据库的方法
如何把excel导入数据库的方法
在Excel中录入好数据以后经常需要把数据导入到数据库里进行管理,或许有的朋友不知道该如何把Excel导入到数据库里头。
下面是由店铺分享的如何把excel导入数据库的方法,以供大家阅读和学习。
如何把excel导入数据库的方法:
Excel导入数据库步骤1:首先打开SQL SERVER 的企业管理器,到你要导入数据的数据库的表上右键,选择所有任务,导入数据。
在弹出的对话框上点击下一步。
Excel导入数据库步骤2:选择数据源为EXCEL如图所示。
Excel导入数据库步骤3:选择要导入的EXCEL文件
Excel导入数据库步骤4:输入你的数据库的登入信息
Excel导入数据库步骤5:选择第一个项目(从源数据库复制表和视图),然后点下一步
Excel导入数据库步骤6:选择你要导入的表的第几页,其中目的表是可以修改的,如果要转换其中的数据,点后面的小方块,上面有三个小点的小方块。
Excel导入数据库步骤7:点击下一步,完成,即可
Excel导入数据库步骤8:数据导入很快的,导入的结果会反馈给你。
点击完成。
Excel导入数据库步骤9:刷新你的数据库,这个时候你可以发现你导入的数据表已经存在并可以使用了。
POI通用导出Excel(.xls,.xlsx)的方法
POI通⽤导出Excel(.xls,.xlsx)的⽅法POI操作EXCEL对象HSSF:操作Excel 97(.xls)格式XSSF:操作Excel 2007 OOXML (.xlsx)格式,操作EXCEL内存占⽤⾼于HSSFSXSSF:从POI3.8 beta3开始⽀持,基于XSSF,低内存占⽤。
使⽤POI的HSSF对象,⽣成Excel 97(.xls)格式,⽣成的EXCEL不经过压缩直接导出。
线上问题:负载服务器转发请求到应⽤服务器阻塞,以及内存溢出。
如果系统存在⼤数据量报表导出,则考虑使⽤POI的SXSSF进⾏EXCEL操作。
HSSF⽣成的Excel 97(.xls)格式本⾝就有每个sheet页不能超过65536条的限制。
XSSF⽣成Excel 2007 OOXML (.xlsx)格式,条数增加了,但是导出过程中,内存占⽤率却⾼于HSSF.SXSSF是⾃3.8-beta3版本后,基于XSSF提供的低内存占⽤的操作EXCEL对象。
其原理是可以设置或者⼿动将内存中的EXCEL⾏写到硬盘中,这样内存中只保存了少量的EXCEL⾏进⾏操作。
EXCEL的压缩率特别⾼,能达到80%,12M的⽂件压缩后才2M左右。
如果未经过压缩、不仅会占⽤⽤户带宽,且会导致负载服务器(apache)和应⽤服务器之间,长时间占⽤连接(⼆进制流转发),导致负载服务器请求阻塞,不能提供服务。
⼀定要注意⽂件流的关闭防⽌前台(页⾯)连续触发导出EXCEL1.通⽤核⼼导出⼯具类 ExcelUtil.javapackage sy.util;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import ng.reflect.Method;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import org.apache.poi.hpsf.SummaryInformation;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFClientAnchor;import ermodel.HSSFComment;import ermodel.HSSFFont;import ermodel.HSSFPatriarch;import ermodel.HSSFRichTextString;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.ss.formula.functions.T;import ermodel.CellStyle;import ermodel.DateUtil;import ermodel.Font;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.streaming.SXSSFCell;import org.apache.poi.xssf.streaming.SXSSFRow;import org.apache.poi.xssf.streaming.SXSSFSheet;import org.apache.poi.xssf.streaming.SXSSFWorkbook;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;public class ExcelUtil{public static String NO_DEFINE = "no_define";//未定义的字段public static String DEFAULT_DATE_PATTERN="yyyy年MM⽉dd⽇";//默认⽇期格式public static int DEFAULT_COLOUMN_WIDTH = 17;/*** 导出Excel 97(.xls)格式,少量数据* @param title 标题⾏* @param headMap 属性-列名* @param jsonArray 数据集* @param datePattern ⽇期格式,null则⽤默认⽇期格式* @param colWidth 列宽默认⾄少17个字节* @param out 输出流*/public static void exportExcel(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) { if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;// 声明⼀个⼯作薄HSSFWorkbook workbook = new HSSFWorkbook();workbook.createInformationProperties();workbook.getDocumentSummaryInformation().setCompany("*****公司");SummaryInformation si = workbook.getSummaryInformation();si.setAuthor("JACK"); //填加xls⽂件作者信息si.setApplicationName("导出程序"); //填加xls⽂件创建程序信息si.setLastAuthor("最后保存者信息"); //填加xls⽂件最后保存者信息si.setComments("JACK is a programmer!"); //填加xls⽂件作者信息si.setTitle("POI导出Excel"); //填加xls⽂件标题信息si.setSubject("POI导出Excel");//填加⽂件主题信息si.setCreateDateTime(new Date());//表头样式HSSFCellStyle titleStyle = workbook.createCellStyle();titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);HSSFFont titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 20);titleFont.setBoldweight((short) 700);titleStyle.setFont(titleFont);// 列头样式HSSFCellStyle headerStyle = workbook.createCellStyle();headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);HSSFFont headerFont = workbook.createFont();headerFont.setFontHeightInPoints((short) 12);headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerStyle.setFont(headerFont);// 单元格样式HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);HSSFFont cellFont = workbook.createFont();cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);cellStyle.setFont(cellFont);// ⽣成⼀个(带标题)表格HSSFSheet sheet = workbook.createSheet();// 声明⼀个画图的顶级管理器HSSFPatriarch patriarch = sheet.createDrawingPatriarch();// 定义注释的⼤⼩和位置,详见⽂档HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,0, 0, 0, (short) 4, 2, (short) 6, 5));// 设置注释内容comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));// 设置注释作者,当⿏标移动到单元格上是可以在状态栏中看到该内容.comment.setAuthor("JACK");//设置列宽int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//⾄少字节数int[] arrColWidth = new int[headMap.size()];// 产⽣表格标题⾏,以及设置列宽String[] properties = new String[headMap.size()];String[] headers = new String[headMap.size()];int ii = 0;for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {String fieldName = iter.next();properties[ii] = fieldName;headers[ii] = fieldName;int bytes = fieldName.getBytes().length;arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;sheet.setColumnWidth(ii,arrColWidth[ii]*256);ii++;}// 遍历集合数据,产⽣数据⾏int rowIndex = 0;for (Object obj : jsonArray) {if(rowIndex == 65535 || rowIndex == 0){if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第⼆页显⽰HSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0titleRow.createCell(0).setCellValue(title);titleRow.getCell(0).setCellStyle(titleStyle);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));HSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1for(int i=0;i<headers.length;i++){headerRow.createCell(i).setCellValue(headers[i]);headerRow.getCell(i).setCellStyle(headerStyle);}rowIndex = 2;//数据内容从 rowIndex=2开始}JSONObject jo = (JSONObject) JSONObject.toJSON(obj);HSSFRow dataRow = sheet.createRow(rowIndex);for (int i = 0; i < properties.length; i++){HSSFCell newCell = dataRow.createCell(i);Object o = jo.get(properties[i]);String cellValue = "";if(o==null) cellValue = "";else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);else cellValue = o.toString();newCell.setCellValue(cellValue);newCell.setCellStyle(cellStyle);}rowIndex++;}// ⾃动调整宽度/*for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}*/try {workbook.write(out);workbook.close();} catch (IOException e) {e.printStackTrace();}}/*** 导出Excel 2007 OOXML (.xlsx)格式* @param title 标题⾏* @param headMap 属性-列头* @param jsonArray 数据集* @param datePattern ⽇期格式,传null值则默认年⽉⽇* @param colWidth 列宽默认⾄少17个字节* @param out 输出流*/public static void exportExcelX(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) { if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;// 声明⼀个⼯作薄SXSSFWorkbook workbook = new SXSSFWorkbook(1000);//缓存workbook.setCompressTempFiles(true);//表头样式CellStyle titleStyle = workbook.createCellStyle();titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);Font titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 20);titleFont.setBoldweight((short) 700);titleStyle.setFont(titleFont);// 列头样式CellStyle headerStyle = workbook.createCellStyle();headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);Font headerFont = workbook.createFont();headerFont.setFontHeightInPoints((short) 12);headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerStyle.setFont(headerFont);// 单元格样式CellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);Font cellFont = workbook.createFont();cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);cellStyle.setFont(cellFont);// ⽣成⼀个(带标题)表格SXSSFSheet sheet = workbook.createSheet();//设置列宽int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//⾄少字节数 int[] arrColWidth = new int[headMap.size()];// 产⽣表格标题⾏,以及设置列宽String[] properties = new String[headMap.size()];String[] headers = new String[headMap.size()];int ii = 0;for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {String fieldName = iter.next();properties[ii] = fieldName;headers[ii] = headMap.get(fieldName);int bytes = fieldName.getBytes().length;arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;sheet.setColumnWidth(ii,arrColWidth[ii]*256);ii++;}// 遍历集合数据,产⽣数据⾏int rowIndex = 0;for (Object obj : jsonArray) {if(rowIndex == 65535 || rowIndex == 0){if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第⼆页显⽰SXSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0titleRow.createCell(0).setCellValue(title);titleRow.getCell(0).setCellStyle(titleStyle);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));SXSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1for(int i=0;i<headers.length;i++){headerRow.createCell(i).setCellValue(headers[i]);headerRow.getCell(i).setCellStyle(headerStyle);}rowIndex = 2;//数据内容从 rowIndex=2开始}JSONObject jo = (JSONObject) JSONObject.toJSON(obj);SXSSFRow dataRow = sheet.createRow(rowIndex);for (int i = 0; i < properties.length; i++){SXSSFCell newCell = dataRow.createCell(i);Object o = jo.get(properties[i]);String cellValue = "";if(o==null) cellValue = "";else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);else if(o instanceof Float || o instanceof Double)cellValue= new BigDecimal(o.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();else cellValue = o.toString();newCell.setCellValue(cellValue);newCell.setCellStyle(cellStyle);}rowIndex++;}// ⾃动调整宽度/*for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}*/try {workbook.write(out);workbook.close();workbook.dispose();} catch (IOException e) {e.printStackTrace();}}//Web 导出excelpublic static void downloadExcelFile(String title,Map<String,String> headMap,JSONArray ja,HttpServletResponse response){ try {ByteArrayOutputStream os = new ByteArrayOutputStream();ExcelUtil.exportExcelX(title,headMap,ja,null,0,os);byte[] content = os.toByteArray();InputStream is = new ByteArrayInputStream(content);// 设置response参数,可以打开下载页⾯response.reset();response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename="+ new String((title + ".xlsx").getBytes(), "iso-8859-1")); response.setContentLength(content.length);ServletOutputStream outputStream = response.getOutputStream();BufferedInputStream bis = new BufferedInputStream(is);BufferedOutputStream bos = new BufferedOutputStream(outputStream);byte[] buff = new byte[8192];int bytesRead;while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {bos.write(buff, 0, bytesRead);}bis.close();bos.close();outputStream.flush();outputStream.close();}catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {int count = 100000;JSONArray ja = new JSONArray();for(int i=0;i<100000;i++){Student s = new Student();s.setName("POI"+i);s.setAge(i);s.setBirthday(new Date());s.setHeight(i);s.setWeight(i);s.setSex(i/2==0?false:true);ja.add(s);}Map<String,String> headMap = new LinkedHashMap<String,String>();headMap.put("name","姓名");headMap.put("age","年龄");headMap.put("birthday","⽣⽇");headMap.put("height","⾝⾼");headMap.put("weight","体重");headMap.put("sex","性别");String title = "测试";/*OutputStream outXls = new FileOutputStream("E://a.xls");System.out.println("正在导出xls....");Date d = new Date();ExcelUtil.exportExcel(title,headMap,ja,null,outXls);System.out.println("共"+count+"条数据,执⾏"+(new Date().getTime()-d.getTime())+"ms");outXls.close();*///OutputStream outXlsx = new FileOutputStream("E://b.xlsx");System.out.println("正在导出xlsx....");Date d2 = new Date();ExcelUtil.exportExcelX(title,headMap,ja,null,0,outXlsx);System.out.println("共"+count+"条数据,执⾏"+(new Date().getTime()-d2.getTime())+"ms"); outXlsx.close();}}class Student {private String name;private int age;private Date birthday;private float height;private double weight;private boolean sex;public String getName() {return name;}public void setName(String name) { = name;}public Integer getAge() {return age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public float getHeight() {return height;}public void setHeight(float height) {this.height = height;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public boolean isSex() {return sex;}public void setSex(boolean sex) {this.sex = sex;}public void setAge(Integer age) {this.age = age;}}2. 控制器Controller 的写法//导出配件列表@RequestMapping(value = "partExport")@ResponseBodypublic void partExportHttpServletResponse response){JSONArray ja = ptmpOrderService.selectStatExport();//获取业务数据集Map<String,String> headMap = ptmpOrderService.getPartStatHeadMap();//获取属性-列头String title = "配件统计表";ExcelUtil.downloadExcelFile(title,headMap,ja,response);}3.前端页⾯的写法(不要⽤异步⽅式请求,如$.post)//可以点击⼀个按钮事件触发下⾯的代码进⾏导出window.open("partExport","_blank");//或者可以提交表单$('#form').attr('action','partExport');$('#form').attr('target','_blank');$('#form').submit();4.POI依赖的jar包(maven pom)<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>5.本地测试将10w条数据导出到本地硬盘中,HSSF⽅式⽤时14s左右,SXSSF⽅式⽤时24s左右,尽管如此,但建议使⽤SXSSF导出.xlsx的excel.之所以使⽤JSONArray作为数据集,⽽没有采⽤java的集合类,是因为JSONObject 在获取数据的时候是采⽤ get(key)的⽅式,正好与属性列对应,这样灵活性⾼,属性列不必与java对象的字段匹配。
java使用POI实现Excel批量导入数据
java使⽤POI实现Excel批量导⼊数据1.准备⼯作1.1 创建模板表头与数据库表字段⼀⼀对应,⽰例如下1.2将模板放⼊项⽬中,如下图所⽰:2.前端页⾯2.1 使⽤超链接提供模板下载地址1 <html lang="zh_CN" xmlns:th=""2 xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">3 <meta charset="utf-8">4 <head th:include="include::header"></head>5 <title>导⼊</title>6 <style type="text/css">7 .message .files {8 position: absolute;9 left: -1000px;10 top: 52px;11 heigth: 26px;12 cursor: pointer;13 filter: Alpha(opacity = 0);14 -moz-opacity: 0;15 opacity: 0;16 }17 </style>18 </head>19 <body>20 <form id="signupForm" method="post" enctype="multipart/form-data">21 <input name="publishTaskId" id="publishTaskId" th:value="${publishTaskId}" hidden>22 <div id="dpLTE" class="container-fluid tc-box">23 <table class="form" id="form" style="table-layout: fixed;">24 <tr>25 <td colspan="2">26 <a id="zhCna"27 href='/modelExcle/fieldTemplate.xlsx'>28 <button type="button" class="btn btn-default"29 style="margin-bottom: 10px">30 <i class="fa fa-download"></i> 下载导⼊模板31 </button>32 </a>33 <div class="alert alert-warning">提⽰:请先下载批量导⼊模板-excel⽂件,按格式填写后上传提交,⽅可导⼊;34 </div>35 </td>36 </tr>37 <tr>38 <td><input type="text" id="txt" name="txt"39 class="input form-control" value="⽂件域" disabled="disabled" /></td>40 <td class="message">41 <input type="button"42 onMouseMove="f.style.pixelLeft=event.x-60;f.style.pixelTop=this.offsetTop;"43 value="选择⽂件" size="30" onClick="f.click()" class="btn btn-orange"44 style="margin-left: 10px">45 <input type="file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" name="SensitiveExcle" id="f"46 onChange="txt.value=this.value" style="height: 26px;" class="files" size="1" hidefocus>47 </td>48 </tr>49 </table>50 </div>51 <div class="form-group">52 <div class="col-sm-6 col-sm-offset-5">53 <button type="submit" class="btn btn-primary">提交</button>54 </div>55 </div>56 </form>57 <div th:include="include::footer"></div>5859 <script src="/js/appjs/sys/auditSecPage/import.js"></script>60 </body>61 </html>2.2 js中调⽤后台⽅法接收EXCEL⽂件流 1function save() {2var formData = new FormData($('#signupForm')[0]);3 $.ajax({4 url : "/sys/audit/importdata",5 type: 'POST',6 data: formData,7 async: true,8 cache: false,9 contentType: false,10 processData: false,11 error : function(request) {12 yer.alert("⽹络超时");13 },14 success : function(data) {15if (data.code == 0) {16 yer.msg("操作成功");17 parent.reLoad();18var index = yer.getFrameIndex();19 yer.close(index);20 } else {21 yer.alert(data.msg)22 }2324 }25 });2627 }3.对应后台业务逻辑3.1 pom⽂件中引⼊对应依赖1 <!-- ⽂件上传组件 -->2 <!-- https:///artifact/commons-net/commons-net -->3 <dependency>4 <groupId>commons-net</groupId>5 <artifactId>commons-net</artifactId>6 <version>3.3</version>7 </dependency>8 <dependency>9 <groupId>org.apache.poi</groupId>10 <artifactId>poi</artifactId>11 <version>3.9</version>12 </dependency>13 <dependency>14 <groupId>org.apache.poi</groupId>15 <artifactId>poi-ooxml</artifactId>16 <version>3.9</version>17 </dependency>3.2对应的⼯具类编写3.2.1封装返回结果1import java.util.HashMap;2import java.util.Map;34public class R extends HashMap<String, Object> {5private static final long serialVersionUID = 1L;67public R() {8 put("code", 0);9 put("msg", "操作成功");10 }1112public static R error() {13return error(1, "操作失败");14 }1516public static R error(String msg) {17return error(500, msg);18 }1920public static R error(int code, String msg) {21 R r = new R();22 r.put("code", code);23 r.put("msg", msg);24return r;25 }2627public static R ok(String msg) {28 R r = new R();29 r.put("msg", msg);30return r;31 }3233public static R ok(Map<String, Object> map) {34 R r = new R();35 r.putAll(map);36return r;37 }3839public static R ok() {40return new R();41 }4243 @Override44public R put(String key, Object value) {45super.put(key, value);46return this;47 }48 }3.2.2 Excel导⼊⼯具类1import ng.StringUtils;2import ermodel.HSSFCell;3import ermodel.HSSFDateUtil;4import ermodel.Cell;5import ermodel.Row;6import ermodel.Sheet;7import ermodel.Workbook;8import ermodel.XSSFCell;9import ermodel.XSSFWorkbook;1011import java.io.FileInputStream;12import java.io.FileNotFoundException;13import java.io.IOException;14import java.text.DateFormat;15import java.text.DecimalFormat;16import java.text.SimpleDateFormat;17import java.util.ArrayList;18import java.util.Date;19import java.util.List;202122/**23 * Excel导⼊⼯具类24 *25 * @author Evan.Zhang26*/27public class ImportExcelUtils {2829/**30 * 创建WorkBook对象31 *32 * @param filePath33 * @return34 * @throws IOException35*/36public static final Workbook createWorkbook(String filePath) throws IOException { 37if (StringUtils.isBlank(filePath)) {38throw new IllegalArgumentException(MassageUtils.getMessage("10011"));39 }40if (!FileUtil.isExists(filePath)) {41throw new FileNotFoundException(MassageUtils.getMessage("10012"));42 }43if (filePath.trim().toLowerCase().endsWith("xls")) {44return new XSSFWorkbook(new FileInputStream(filePath));45 } else if (filePath.trim().toLowerCase().endsWith("xlsx")) {46return new XSSFWorkbook(new FileInputStream(filePath));47 } else {48throw new IllegalArgumentException(MassageUtils.getMessage("10013"));49 }50 }5152/**53 * 获取Sheet页⾯(按名称)54 *55 * @param wb56 * @param sheetName57 * @return58*/59public static final Sheet getSheet(Workbook wb, String sheetName) {60return wb.getSheet(sheetName);61 }6263/**64 * 获取Sheet页⾯(按页标)65 *66 * @param wb67 * @param index68 * @return69*/70public static final Sheet getSheet(Workbook wb, int index) {71return wb.getSheetAt(index);72 }7374/**75 * 获取Sheet页内容76 *77 * @param sheet78 * @return79*/80public static final List<Object[]> listFromSheet(Sheet sheet) {8182 List<Object[]> list = new ArrayList<Object[]>();83for (int r = sheet.getFirstRowNum(); r <= sheet.getLastRowNum(); r++) {84 Row row = sheet.getRow(r);85if (row == null || row.getPhysicalNumberOfCells() == 0) continue;86 Object[] cells = new Object[row.getLastCellNum()];87for (int c = row.getFirstCellNum(); c <= row.getLastCellNum(); c++) {88 Cell cell = row.getCell(c);89if (cell == null) continue;90//判断是否为⽇期类型91if (HSSFDateUtil.isCellDateFormatted(cell)) {92//⽤于转化为⽇期格式93 Date d = cell.getDateCellValue();94 DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");95 cells[c] = formater.format(d);96 } else {97 cells[c] = getValueFromCell(cell);98 }99100101 }102 list.add(cells);103 }104return list;105 }106107108/**109 * 获取单元格内信息110 *111 * @param cell112 * @return113*/114public static final Object getValueFromCell(Cell cell) {115if (cell == null) {116 System.out.println("Cell is null ");117return null;118 }119 Object result = null;120if (cell instanceof HSSFCell) {121if (cell != null) {122// 单元格类型:Numeric:0,String:1,Formula:2,Blank:3,Boolean:4,Error:5 123int cellType = ((HSSFCell) cell).getCellType();124switch (cellType) {125case HSSFCell.CELL_TYPE_STRING:126 result = ((HSSFCell) cell).getStringCellValue();127break;128case HSSFCell.CELL_TYPE_NUMERIC:129 DecimalFormat df = new DecimalFormat("###.####");130 result = df.format(((HSSFCell) cell).getNumericCellValue());131break;132case HSSFCell.CELL_TYPE_FORMULA:133 result = ((HSSFCell) cell).getNumericCellValue();134break;135case HSSFCell.CELL_TYPE_BOOLEAN:136 result = ((HSSFCell) cell).getBooleanCellValue();137break;138case HSSFCell.CELL_TYPE_BLANK:139 result = null;140break;141case HSSFCell.CELL_TYPE_ERROR:142 result = null;143break;144default:145 System.out.println("枚举了所有类型");146break;147 }148 }149 } else if (cell instanceof XSSFCell) {150if (cell != null) {151// 单元格类型:Numeric:0,String:1,Formula:2,Blank:3,Boolean:4,Error:5152int cellType = ((XSSFCell) cell).getCellType();153switch (cellType) {154case XSSFCell.CELL_TYPE_STRING:155 result = ((XSSFCell) cell).getRichStringCellValue().getString();156break;157case XSSFCell.CELL_TYPE_NUMERIC:158 DecimalFormat df = new DecimalFormat("###.####");159 result = df.format(((XSSFCell) cell).getNumericCellValue());160break;161case XSSFCell.CELL_TYPE_FORMULA:162 result = ((XSSFCell) cell).getNumericCellValue();163break;164case XSSFCell.CELL_TYPE_BOOLEAN:165 result = ((XSSFCell) cell).getBooleanCellValue();166break;167case XSSFCell.CELL_TYPE_BLANK:168 result = null;169break;170case XSSFCell.CELL_TYPE_ERROR:171 result = null;172break;173default:174 System.out.println("枚举了所有类型");175break;176 }177 }178 }179return result;180 }181182183/**184 * 根据Sheet页导⼊Excel信息185 *186 * @param filePath ⽂件路径187 * @param sheetIndex Sheet页下标188 * @param startRow 开始列:默认第⼀列189 * @param startLine 开始⾏:默认第⼀⾏190 * @throws Exception191*/192public static final List<Object[]> importExcelBySheetIndex(String filePath, int sheetIndex 193 , int startRow, int startLine) throws Exception {194195 List<Object[]> resultList = null;196197//创建WorkBook对象198 Workbook wb = createWorkbook(filePath);199200// 获取Sheet201 Sheet sheet = ImportExcelUtils.getSheet(wb, sheetIndex);202203// 判断Sheet是否为空204if (sheet != null) {205206// 遍历Sheet207 List<Object[]> list = ImportExcelUtils.listFromSheet(sheet);208if (list != null && list.size() > 0) {209 resultList = new ArrayList<Object[]>();210if (startLine <= list.size()) {211for (int i = startLine; i < list.size(); i++) {212int nullCount = 0;213 Object[] rows = list.get(i);214if (rows != null && rows.length > 0) {215 List<Object> resultObjects = new ArrayList<Object>();216for (int n = startRow; n < rows.length; n++) {217if (IsNullUtils.isEmpty(rows[n])) {218 nullCount++;219 }220 resultObjects.add(rows[n]);221 }222223//判断空的单元格个数224if (nullCount >= rows.length) {225break;226 } else {227 resultList.add(resultObjects.toArray());228 }229 }230 }231 }232 }233 }234return resultList;235 }236 }3.2.3 封装判空⽅法⼯具类1import java.util.List;2import java.util.Map;3import java.util.Set;45/**6 * 判空⽅法⼯具类8*/9public class IsNullUtils {101112/**13 * 对象是否为空14 * @param o String,List,Map,Object[],int[],long[]15 * @return16*/17 @SuppressWarnings("rawtypes")18public static boolean isEmpty(Object o) {19if (o == null) {20return true;21 }22if (o instanceof String) {23if (o.toString().trim().equals("")) {24return true;25 }26if (o.equals("null") || o.equals("NULL")) {27return true;28 }29 } else if (o instanceof List) {30if (((List) o).size() == 0) {31return true;32 }33 } else if (o instanceof Map) {34if (((Map) o).size() == 0) {35return true;36 }37 } else if (o instanceof Set) {38if (((Set) o).size() == 0) {39return true;40 }41 } else if (o instanceof Object[]) {42if (((Object[]) o).length == 0) {43return true;44 }45 } else if (o instanceof int[]) {46if (((int[]) o).length == 0) {47return true;48 }49 } else if (o instanceof long[]) {50if (((long[]) o).length == 0) {51return true;52 }53 }54return false;55 }565758 }3.2.4 ⽂件上传⽅法1import org.springframework.web.multipart.MultipartFile;2import javax.servlet.http.HttpServletRequest;3import java.io.File;4import java.io.IOException;56/**7 * ⽂件上传8*/9public class UploadFile {1011/**12 * ⽂件上传⽅法13*/1415public static boolean fileUpLoad(MultipartFile[] files, HttpServletRequest request, String path)16throws IOException {1718if (files != null && files.length > 0) {19for (int i = 0; i < files.length; i++) {20 MultipartFile file = files[i];21// 保存⽂件22return saveFile(request, file, path);23 }24 }25return false;26 }2728/**29 * 保存上传⽂件30 *31 * @param request32 * @param file33 * @return34*/3536public static boolean saveFile(HttpServletRequest request, MultipartFile file, String path) {3738if (!file.isEmpty()) {39try {40 File saveDir = new File(path);41if (!saveDir.getParentFile().exists())42 saveDir.getParentFile().mkdirs();43// 转存⽂件44 file.transferTo(saveDir);45return true;46 } catch (Exception e) {47 e.printStackTrace();48 }49 }50return false;51 }5253 }3.3控制层接收⽂件流1/*2 * 批量导⼊数据3 * */4 @ResponseBody5 @PostMapping("/importdata")6 R importdata(@RequestParam("publishTaskId") String publishTaskId,@RequestParam("SensitiveExcle") MultipartFile[] files,HttpServletRequest request)throws Exception { 7return checkFieldInfoService.importData(publishTaskId,files,request);8 }3.4 编写接⼝1import org.springframework.web.multipart.MultipartFile;23import javax.servlet.http.HttpServletRequest;45public interface CheckFieldInfoService {6 R importData(String publishTaskId,MultipartFile[] files, HttpServletRequest request);7 }3.5 实现插⼊业务逻辑1package com.system.service.impl;234import com.system.dao.CheckFieldInfoMapper;5import com.system.domain.audit.CheckFieldInfo;6import com.system.service.CheckFieldInfoService;7import mon.utils.R;8import com.system.utils.ImportExcelUtils;9import com.system.utils.IsNullUtils;10import com.system.utils.UploadFile;11import ermodel.Sheet;12import ermodel.Workbook;13import org.springframework.beans.factory.annotation.Autowired;14import org.springframework.stereotype.Service;15import org.springframework.web.multipart.MultipartFile;16import javax.servlet.http.HttpServletRequest;17import java.io.IOException;18import java.util.*;1920 @Service21public class CheckFieldInfoServiceImpl implements CheckFieldInfoService {2223 @Autowired24private CheckFieldInfoMapper checkFieldInfoMapper;25 @Override26public R importData(String publishTaskId, MultipartFile[] files, HttpServletRequest request) {27int count = 0;28/*上传路径*/29 String path = "/file/fileExcle/" + files[0].getOriginalFilename();30try {31boolean status = UploadFile.fileUpLoad(files, request, path);32if (!status) {33return R.error("⽂件上传失败!");34 }35 } catch (IOException e1) {36// TODO Auto-generated catch block37 e1.printStackTrace();38 }39 Workbook workbook = null; //⼯作簿40 Sheet sheet = null; //⼯作表41 String[] headers = null; //表头信息4243try {44 workbook = ImportExcelUtils.createWorkbook(path);45 } catch (Exception e) {46 e.printStackTrace();47 }48 sheet = ImportExcelUtils.getSheet(workbook, 0);49 List<Object[]> oList = ImportExcelUtils.listFromSheet(sheet);50if (!IsNullUtils.isEmpty(oList)) {51 headers = Arrays.asList(oList.get(0)).toArray(new String[0]);52if (!headers[0].replaceAll(" ", "").equals("ID")) {53return R.error("请选择正确模板导⼊!");54 }55 }5657 List<CheckFieldInfo> senList = new ArrayList<CheckFieldInfo>();58if (!IsNullUtils.isEmpty(oList.get(1))) {59for (int s = 1; s < oList.size(); s++) {60 String[] rows = null;61 rows = Arrays.asList(oList.get(s)).toArray(new String[0]);62 R r = null;63 CheckFieldInfo checkFieldInfo = new CheckFieldInfo();64 checkFieldInfo.setFieldId(UUID.randomUUID().toString());65 checkFieldInfo.setPublishTaskId(publishTaskId);66 checkFieldInfo.setId(Integer.parseInt(rows[0]));67 checkFieldInfo.setFieldname(rows[1]);68 checkFieldInfo.setFieldtype(rows[2]);69 checkFieldInfo.setLenPrecision(rows[3]);70 checkFieldInfo.setLenScala(rows[4]);71 checkFieldInfo.setFieldformat(rows[5]);72 checkFieldInfo.setChecknull(rows[6]);73 checkFieldInfo.setCheckrepeat(rows[7]);74 checkFieldInfo.setCheckenum(rows[8]);75 checkFieldInfo.setEnumvalue(rows[9]);76 senList.add(checkFieldInfo);77 }78if (senList.size() > 0) {79for (CheckFieldInfo c : senList) {80 count = checkFieldInfoMapper.insertData(c);81if (count<=0){82 R.error("批量导⼊异常");83 }8485 }8687 }88 }89return R.ok();90 }91 }完成以上操作即可简单实现POI⽅式使⽤Excel表格实现数据批量导⼊功能。
poiexcel批量导入解决各类型的数据
poiexcel批量导入解决各类型的数据注意引入的都是poi的包,使用Cell,excel2003的.xls对应是HSSFCell,而之后的xlsx对应的则是XSSFCell,但是他们都继承于Cell,所以使用Cell就可以使用两种格式的excel导入了,下面解决excel中数据的各种格式[java] view plain copy1.//读取excel2.try {3.request.setCharacterEncoding("gbk");4.response.setContentType("text/html;charset=gbk");5.// 1. 创建工厂类6.DiskFileItemFactory factory = new DiskFileItemFactory();7.// 2. 创建FileUpload对象8.ServletFileUpload upload = new ServletFileUpload(factor y);9.10.// 3. 判断是否是上传表单11.// boolean b = upload.isMultipartContent(request);12.// 设置上传文件最大值13.upload.setSizeMax(25 * 1024 * 1024);14.// 是文件上传表单15.// 4. 解析request,获得FileItem项16.List<FileItem> fileitems = upload.parseRequest(reque st);17.// 5. 遍历集合18.for (FileItem item : fileitems) {19.// 判断是不是普通字段20.if (!item.isFormField()) {21.// 获得流,读取数据写入文件22.InputStream in = item.getInputStream();23.Workbook book = createWorkBook(in,item.getName() );24.// 获得第一个工作表对象25.Sheet sheet = book.getSheetAt(0);26.if(0==sheet.getLastRowNum()){27.//如果没有数据28.request.setAttribute("message", "excel的sheet0中不存在数据");29.request.getRequestDispatcher("/cc/util/excelToData.js p").forward(request, response);30.}31.32.// 第一行为标题,从第二行开始录入33.for (int i = 1; i <= sheet.getLastRowNum(); i++) {34.//标题行,用来对比方便得到数据35.Row titleRow = sheet.getRow(0);36.//数据行37.Row row = sheet.getRow(i);38.//获得值39.String value_temp= this.getValue((Cell) row.getCell(2));40.}41.}42.}43.44.} catch (Exception e) {45. e.printStackTrace();46.message="导入失败<br/>"+message;47.request.setAttribute("message",message);48.request.getRequestDispatcher("/cc/util/excelToData.js p").forward(request, response);49.50.}数字类型时间类型字符串类型验证没问题,数字类型如果是1234.0会将其变成1234 如果是1234.5保存仍然保持小数位1234.5,用来解决电话号码和普通数字问题时间类型将其格式化成了2015-12-09 12:13:12这种格式便于保存数据库[java] view plain copy1.//解决excel类型问题,获得数值2.public String getValue(Cell cell) {3.String value = "";4.if(null==cell){5.return value;6.}7.switch (cell.getCellType()) {8.//数值型9.case Cell.CELL_TYPE_NUMERIC:10.if (HSSFDateUtil.isCellDateFormatted(cell)) {11.//如果是date类型则,获取该cell的date值12.Date date = HSSFDateUtil.getJavaDate(cell.getNumeri cCellValue());13.SimpleDateFormat format = new SimpleDateFormat(" yyyy-MM-dd HH:mm:ss");14.value = format.format(date);;15.}else {// 纯数字16.BigDecimal big=new BigDecimal(cell.getNumericCellV alue());17.value = big.toString();18.//解决1234.0 去掉后面的.019.if(null!=value&&!"".equals(value.trim())){20.String[] item = value.split("[.]");21.if(1<item.length&&"0".equals(item[1])){22.value=item[0];23.}24.}25.}26.break;27.//字符串类型28.case Cell.CELL_TYPE_STRING:29.value = cell.getStringCellValue().toString();30.break;31.// 公式类型32.case Cell.CELL_TYPE_FORMULA:33.//读公式计算值34.value = String.valueOf(cell.getNumericCellValue());35.if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串36.value = cell.getStringCellValue().toString();37.}38.break;39.// 布尔类型40.case Cell.CELL_TYPE_BOOLEAN:41.value = " "+ cell.getBooleanCellValue();42.break;43.// 空值44.case Cell.CELL_TYPE_BLANK:45.value = "";46.LogUtil.getLogger().error("excel出现空值");47.break;48.// 故障49.case Cell.CELL_TYPE_ERROR:50.value = "";51.LogUtil.getLogger().error("excel出现故障");52.break;53.default:54.value = cell.getStringCellValue().toString();55.}56.if("null".endsWith(value.trim())){57.value="";58.}59.return value;60.}。
将excel表导入数据库的方法步骤
将excel表导入数据库的方法步骤在Excel中录入好数据以后,可能会有导入数据库的需求,这个时候就需要利用一些技巧导入。
接下来是店铺为大家带来的如何将excel 表导入数据库的方法,希望对你有用。
将excel表导入数据库的方法Excel导入数据库步骤1:对于把大量数据存放到数据库中,最好是用图形化数据库管理工具,可是如果没有了工具,只能执行命令的话这会是很费时间的事。
那我们只能对数据进行组合,把数据组成insert语句然后在命令行中批量直行即可。
Excel导入数据库步骤2:我们对下面数据进行组合,这用到excel 中的一个功能。
在excel中有个fx的输入框,在这里把组好的字符串填上去就好了。
注:字符串1 & A2 &字符串2 & ...A2可以直接输入,也可以用鼠标点对应的单元格。
Excel导入数据库步骤3:每个字符串之间用 & 符号进行连接。
下面是第一条连接字符串="insert into tavern values('"&A2&"','"&B2&"','"&C2&"','"&D2&"');"写好后按回车键Enter就能组合出对应的字符串了。
insert into tavern values('jw_agi','曙光','0','1');Excel导入数据库步骤4:组好第一行的字符串后,把鼠标放到单元格右下方,出现加粗的十字,单击按下(别松开),一直往下拉,直到最后一行再放开就行了。
5这样我们就把insert语句都整理好了,接下来就是大家把这些语句批量执行就可以了。
如何操作Excel读取数据导入DB2数据库-电脑资料
如何操作Excel读取数据导入DB2数据库-电脑资料最近项目需要读取Excel,将数据导入数据库保存,最终可以用报表读取数据库并显示,比较简单,。
查了一下两者的资料,觉的也无所谓,我需要的功能比较简单,只要能读取Excel数据就行,最后决定使用POI,比较信任apache下面附的代码是一个Demo,功能点有两个:一就是POI读取Excel,二是DB2数据库的连接和SQL执行。
现在的问题就是这样做的话代码太死,针对一张Excel表就要编写一个专门的转换类,太麻烦了,要考虑怎么实现一个通用转换类。
import java.io.FileInputStream;import java.io.IOException;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Statement;import ermodel.HSSFCell;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;public class POITest {private static Connection conn = null;private static Statement stmt = null;private static boolean connectDB2() {String url = "";String username = "username";String password = "password";//加载驱动程序以连接数据库try {//添加类库驱动包db2jcc.jar和db2jcc_license_cu.jarClass.forName("com.ibm.db2.jcc.DB2Driver");url = "jdbc:db2://192.168.0.1:50000/dbname";//添加类库驱动包db2java.jar//Class.forName("com.ibm.db2.jdbc.app.DB2Driver").newIns tance();//url = "jdbc:db2:njtcdata";conn = DriverManager.getConnection(url, username, password);stmt = conn.createStatement();}//捕获加载驱动程序异常catch (ClassNotFoundException cnfex) {System.err.println("装载JDBC驱动程序失败。
【IT专家】小例子:java利用poi读取excel中数据并导入数据库
本文由我司收集整编,推荐下载,如有疑问,请与我司联系小例子:java 利用poi 读取excel 中数据并导入数据库2015/12/17 5355 问题描述:文件夹下有若干excel 文件,文件名为10.教育局.xls 11.卫生院.xls ................有很多;中间的汉字为单位名称,需要导入数据库,每个单位名称要有一个单位id匹配;每个excel 中有若干个sheet 页的名字,每个名字即为科室名称,要导入数据库并有科室id解决方案:利用poi 即可读取出每个sheet 页的名字读取单位名称:用File 类中的方法可获取到每个excel 文件名,由于所需要的单位名称就夹在两个“.”之间,可用indexOf()和lastIndexOf()获取到两个点的下标,然后获取子串得到单位名称A.javapackage importry;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;public class A { public static void main(String[] args) { // TODO Auto-generated method stub String path = “C:\\Users\\Administrator\\Desktop\\尝试”;File file = new File(path); File[] filelist = file.listFiles(); C cc =new C(); //filelist[0].toString()为每个excel 文件的完整路径System.out.println(“该文件夹下的文件个数:”+filelist.length);for(int i=0;i filelist.length;++i) try { //对文件名进行字符串的相关处理,获得所需要的单位名称String s = filelist[i].getName(); String dwmc =s.substring(s.indexOf(46)+1,stIndexOf(46)); //导入单位名称cc.import_dw(dwmc); InputStream is = new FileInputStream(filelist[i].toString()); HSSFWorkbook wb = new HSSFWorkbook(is);//创建工作簿int sheetnumber = wb.getNumberOfSheets();//获取此。
POI_Excel表格数据导入导出实例--支持xlsxlsx格式
POI_Excel表格数据导⼊导出实例--⽀持xlsxlsx格式⼀、Excel导⼊数据库实例 注意:xlsx格式需导⼊xmlbeans包,否则会报错,相关jar下载地址:1.后台controller实例代码:1/**2 * 从EXCEL导⼊到数据库3*/4 @RequestMapping(value="/readCardExcel")5public ModelAndView readCourseExcel(6 @RequestParam(value="excel",required=false) MultipartFile file7 ) throws Exception{8 ModelAndView mv = this.getModelAndView();9 PageData pd = new PageData();10int saveSum=0,updateSum=0,errorSum=0; //保存成功导⼊的数11 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");12if (null != file && !file.isEmpty()) {13 String filePath = PathUtil.getClasspath() + Const.FILEPATHFILE; //⽂件上传路径14 String fileName = FileUpload.fileUp(file, filePath, "cardexcel"); //执⾏上传1516 List<PageData> listPd = (List)ObjectExcelRead.readCardExcel(filePath, fileName, 1, 0, 0); //执⾏读EXCEL操作,读出的数据导⼊List 1:从第2⾏开始;0:从第A列开始;0:第0个sheet 1718/**19 * var0 :名称20 * var1 :账款21 * var2 :款率22 * var3 :备注23*/24for(int i=0;i<listPd.size();i++){25 String var0=listPd.get(i).getString("var0");26 String var1=listPd.get(i).getString("var1");27 String reg = "^[0-9]+(.[0-9]+)?$";28//账款不是数字类型,则跳过29if(!var1.matches(reg) && !(var1.contains("E") || var1.contains("e"))){30continue;31 }32 String var2=listPd.get(i).getString("var2");33 String var3=listPd.get(i).getString("var3");34 pd.put("name", var0);35 pd.put("balance",var1);36 pd.put("ratio",var2);37 pd.put("updateTime",sdf.format(new Date()));38//查询名称是否已存在账款,存在则更新39 PageData pdd=receivablesService.selectReceivables(pd);40if(pdd != null){41int updateResult=receivablesService.updateReceivables(pd);42 updateSum=updateResult==1?updateSum+updateResult:updateResult+0;43 errorSum=updateResult==1?errorSum+0:errorSum+1;44 }else{45int saveResult=receivablesService.saveReceivables(pd);46 saveSum=saveResult==1?saveSum+saveResult:saveSum+0;47 errorSum=saveResult==1?errorSum+0:errorSum+1;48 }4950 }51/*存⼊数据库操作======================================*/5253 mv.addObject("msg","保存成功 " +saveSum+ " 条,更新"+updateSum+"条,失败:"+errorSum+"条");54 }5556 mv.setViewName("company/saveReceivables_result");57return mv;58 }2.类FileUpload:1package com.credit.util;23import java.io.File;4import java.io.IOException;5import java.io.InputStream;67import mons.io.FileUtils;8import org.springframework.web.multipart.MultipartFile;910/**11 * 上传⽂件13 * @version14*/15public class FileUpload {1617/**18 * @param file //⽂件对象19 * @param filePath //上传路径20 * @param fileName //⽂件名21 * @return⽂件名22*/23public static String fileUp(MultipartFile file, String filePath, String fileName){24 String extName = ""; // 扩展名格式:25try {26if (file.getOriginalFilename().lastIndexOf(".") >= 0){27 extName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));28 }29 copyFile(file.getInputStream(), filePath, fileName+extName).replaceAll("-", "");30 } catch (IOException e) {31 System.out.println(e);32 }33return fileName+extName;34 }3536/**37 * 写⽂件到当前⽬录的upload⽬录中38 *39 * @param in40 * @param fileName41 * @throws IOException42*/43private static String copyFile(InputStream in, String dir, String realName)44throws IOException {45 File file = new File(dir, realName);46if (!file.exists()) {47if (!file.getParentFile().exists()) {48 file.getParentFile().mkdirs();49 }50 file.createNewFile();51 }52 FileUtils.copyInputStreamToFile(in, file);53return realName;54 }55 }3.读取Excel数据关键代码:readCardExcel1/**import java.util.Date;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFFont;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.springframework.web.servlet.view.document.AbstractExcelView;import com.util.PageData;import com.util.Tools;2 * 读取Excel表格内容----⽀持xlsx格式和xls格式3 * @param filepath //⽂件路径4 * @param filename //⽂件名5 * @param startrow //开始⾏号6 * @param startcol //开始列号7 * @param sheetnum //sheet8 * @return list9*/10public static List<Object> readCardExcel(String filepath, String filename, int startrow, int startcol, int sheetnum) {11 List<Object> varList = new ArrayList<Object>();1213try {14 File target = new File(filepath, filename);15 FileInputStream fi = new FileInputStream(target);16 String suffix=filename.substring(stIndexOf(".")+1); //获取⽂件后缀名17if("xlsx".equals(suffix)){ //.xlsx格式读取18 XSSFWorkbook xwb = new XSSFWorkbook(fi); //利⽤poi读取excel⽂件流19 XSSFSheet sheet = xwb.getSheetAt(sheetnum); //读取sheet的第⼀个⼯作表20// HSSFWorkbook wb = new HSSFWorkbook(fi);21// HSSFSheet sheet = wb.getSheetAt(sheetnum); //sheet 从0开始22int rowNum = sheet.getLastRowNum() + 1; //取得最后⼀⾏的⾏号2324for (int i = startrow; i < rowNum; i++) { //⾏循环开始2526 PageData varpd = new PageData();27 XSSFRow row = sheet.getRow(i); //⾏28int cellNum = row.getLastCellNum(); //每⾏的最后⼀个单元格位置2930for (int j = startcol; j < cellNum; j++) { //列循环开始3132 XSSFCell cell = row.getCell(Short.parseShort(j + ""));33 String cellValue = null;34if (null != cell) {35switch (cell.getCellType()) { // 判断excel单元格内容的格式,并对其进⾏转换,以便插⼊数据库 36case 0:37 DecimalFormat df = new DecimalFormat("0.0000");38 cellValue = df.format(cell.getNumericCellValue());39// cellValue = String.valueOf(cell.getNumericCellValue());40break;41case 1:42 cellValue = cell.getStringCellValue();43break;44case 2:45 cellValue = cell.getNumericCellValue() + "";46break;47case 3:48 cellValue = "";49break;50case 4:51 cellValue = String.valueOf(cell.getBooleanCellValue());52break;53case 5:54 cellValue = String.valueOf(cell.getErrorCellValue());55break;56 }57 } else {58 cellValue = "";59 }6061 varpd.put("var"+j, cellValue);6263 }64 varList.add(varpd);65 }66 }else if("xls".equals(suffix)){ //.xls格式读取67// XSSFWorkbook xwb = new XSSFWorkbook(fi);68// XSSFSheet sheet = xwb.getSheetAt(sheetnum); //读取sheet的第⼀个⼯作表69 HSSFWorkbook wb = new HSSFWorkbook(fi); //利⽤poi读取excel⽂件流70 HSSFSheet sheet = wb.getSheetAt(sheetnum); //sheet 从0开始71int rowNum = sheet.getLastRowNum() + 1; //取得最后⼀⾏的⾏号7273for (int i = startrow; i < rowNum; i++) { //⾏循环开始7475 PageData varpd = new PageData();76//XSSFRow row = sheet.getRow(i); //⾏77 HSSFRow row = sheet.getRow(i); //⾏78int cellNum = row.getLastCellNum(); //每⾏的最后⼀个单元格位置7980for (int j = startcol; j < cellNum; j++) { //列循环开始8182//XSSFCell cell = row.getCell(Short.parseShort(j + ""));83 HSSFCell cell = row.getCell(Short.parseShort(j + ""));84 String cellValue = null;85if (null != cell) {86switch (cell.getCellType()) { // 判断excel单元格内容的格式,并对其进⾏转换,以便插⼊数据库 87case 0:88 DecimalFormat df = new DecimalFormat("0");89 cellValue = df.format(cell.getNumericCellValue());90// cellValue = String.valueOf((int) cell.getNumericCellValue());91break;92case 1:93 cellValue = cell.getStringCellValue();94break;95case 2:96 cellValue = cell.getNumericCellValue() + "";97break;98case 3:99 cellValue = "";100break;101case 4:102 cellValue = String.valueOf(cell.getBooleanCellValue());103break;104case 5:105 cellValue = String.valueOf(cell.getErrorCellValue());106break;107 }108 } else {109 cellValue = "";110 }111112 varpd.put("var"+j, cellValue);113114 }115 varList.add(varpd);116 }117 }118119120 } catch (Exception e) {121 System.out.println(e);122 }123124return varList;125 }3.导出Excel实例 1.controller代码实例1/*2 * 导出到excel3 * @return4*/5 @RequestMapping(value="/excel")6public ModelAndView exportExcel(){7 logBefore(logger, "导出到excel");8 ModelAndView mv = new ModelAndView();9 PageData pd = new PageData();10 pd = this.getPageData();11try{12 Map<String,Object> dataMap = new HashMap<String,Object>();13 List<String> titles = new ArrayList<String>();14 titles.add("课程名称"); //115 titles.add("课程分类"); //216 titles.add("作⽤"); //317 titles.add("⽬标"); //418 titles.add("课程开始时间"); //519 titles.add("课程结束时间"); //620 titles.add("课程价格"); //721 titles.add("V卡价格"); //822 titles.add("是否结束"); //923 titles.add("课程满⾜⼈数"); //1024 titles.add("课程已预约⼈数"); //1125 titles.add("课程地点"); //1226 titles.add("课程视频地址"); //1327 titles.add("课程介绍"); //1428 titles.add("课程图像"); //1529 titles.add("课程注意事项"); //1630 titles.add("课程群⼆维码地址"); //1731 titles.add("备注"); //1832 dataMap.put("titles", titles);33 List<PageData> varOList = courseService.listAll(pd);34 List<PageData> varList = new ArrayList<PageData>();35for(int i=0;i<varOList.size();i++){36 PageData vpd = new PageData();37 vpd.put("var1", varOList.get(i).getString("COURSENAME")); //138 vpd.put("var2", varOList.get(i).getString("CLASSIFY")); //239 vpd.put("var3", varOList.get(i).getString("EFFECT")); //340 vpd.put("var4", varOList.get(i).getString("TARGET")); //441 vpd.put("var5", varOList.get(i).getString("COURSETIMEB")); //542 vpd.put("var6", varOList.get(i).getString("COURSETIMEE")); //643 vpd.put("var7", varOList.get(i).getString("COURSEPRICE")); //744 vpd.put("var8", varOList.get(i).getString("VPRICE")); //845 vpd.put("var9", varOList.get(i).get("HASOVER").toString()); //946 vpd.put("var10", varOList.get(i).get("COURSEFULLNUMBER").toString()); //1047 vpd.put("var11", varOList.get(i).get("COURSEORDERNUMBER").toString()); //1148 vpd.put("var12", varOList.get(i).getString("COURSEADD")); //1249 vpd.put("var13", varOList.get(i).getString("COURSEVIDEO")); //1350 vpd.put("var14", varOList.get(i).getString("COURSEINTRO")); //1451 vpd.put("var15", varOList.get(i).getString("COUSERPIC")); //1552 vpd.put("var16", varOList.get(i).getString("COURSEATTENTION")); //1653 vpd.put("var17", varOList.get(i).getString("COURSEQRCODE")); //1754 vpd.put("var18", varOList.get(i).getString("REMARK")); //1855 varList.add(vpd);56 }57 dataMap.put("varList", varList);58 ObjectExcelView erv = new ObjectExcelView();59 mv = new ModelAndView(erv,dataMap);60 } catch(Exception e){61 logger.error(e.toString(), e);62 }63return mv;64 } 2.类ObjectExcelView1package com.util;23import java.util.Date;4import java.util.List;5import java.util.Map;67import javax.servlet.http.HttpServletRequest;8import javax.servlet.http.HttpServletResponse;910import ermodel.HSSFCell;11import ermodel.HSSFCellStyle;12import ermodel.HSSFFont;13import ermodel.HSSFSheet;14import ermodel.HSSFWorkbook;15import org.springframework.web.servlet.view.document.AbstractExcelView;1617import com.util.PageData;18import com.util.Tools;19/**20* 导⼊到EXCEL21* 类名称:ObjectExcelView.java22* 类描述:23* @author capv24* 作者单位:25* 联系⽅式:26* @version 1.027*/28public class ObjectExcelView extends AbstractExcelView{2930 @Override31protected void buildExcelDocument(Map<String, Object> model,32 HSSFWorkbook workbook, HttpServletRequest request,33 HttpServletResponse response) throws Exception {34// TODO Auto-generated method stub35 Date date = new Date();36 String filename = Tools.date2Str(date, "yyyyMMddHHmmss");37 HSSFSheet sheet;38 HSSFCell cell;39 response.setContentType("application/octet-stream");40 response.setHeader("Content-Disposition", "attachment;filename="+filename+".xls");41 sheet = workbook.createSheet("sheet1");4243 List<String> titles = (List<String>) model.get("titles");44int len = titles.size();45 HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式46 headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);47 headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);48 HSSFFont headerFont = workbook.createFont(); //标题字体49 headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);50 headerFont.setFontHeightInPoints((short)11);51 headerStyle.setFont(headerFont);52short width = 20,height=25*20;53 sheet.setDefaultColumnWidth(width);54for(int i=0; i<len; i++){ //设置标题55 String title = titles.get(i);56 cell = getCell(sheet, 0, i);57 cell.setCellStyle(headerStyle);58 setText(cell,title);59 }60 sheet.getRow(0).setHeight(height);6162 HSSFCellStyle contentStyle = workbook.createCellStyle(); //内容样式63 contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);64 List<PageData> varList = (List<PageData>) model.get("varList");65int varCount = varList.size();66for(int i=0; i<varCount; i++){67 PageData vpd = varList.get(i);68for(int j=0;j<len;j++){69 String varstr = vpd.getString("var"+(j+1)) != null ? vpd.getString("var"+(j+1)) : "";70 cell = getCell(sheet, i+1, j);71 cell.setCellStyle(contentStyle);72 setText(cell,varstr);73 }7475 }7677 }7879 }。
将Excel数据导入mysql数据库的几种方案
前几天需要将Excel表格中的数据导入到mysql数据库中,在网上查了半天,研究了半天,总结出以下几种方法,下面和大家分享一下:一.用java来将Excel表格中的数据转到mysql中这是我们用的第一种方法,就是在java找你感谢个类,然后这个类会将Excel表格中的数据存储到内存里,然后再从内存中读出来插入到数据库中,但是要注意了,这里是存储到String[ ]数组里面,所以取出来的数据也是String类型,如果你的表里面有int类型的数据,那么你一定要将那一条取出来然后强制转换,如果你的数据表结构没有那么复杂,比较简单的话那么可以使用这种方法,如果字段的结构复杂那也可以使用,只不过要慢慢转,多写点代码,不怕累的同志可以试试.下面是我从网上查的代码:1、添加POI jar包到项目的lib目录下2、Excel文件目录:d://excel.xls3、数据库字段为:num1 num2 num3 num4 num5 num64、数据库名:blog5、表名:test6、编写类:连接mysql的字符串方法、插入的方法、实体类import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import mons.logging.Log;import mons.logging.LogFactory;import ermodel.HSSFCell;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;public class TestExcel {//记录类的输出信息static Log log = LogFactory.getLog(TestExcel.class);//获取Excel文档的路径public static String filePath = "D://excel.xls";public static void main(String[] args) {try {// 创建对Excel工作簿文件的引用HSSFWorkbook wookbook = new HSSFWorkbook(new FileInputStream(filePath));// 在Excel文档中,第一张工作表的缺省索引是0,// 其语句为:HSSFSheet sheet = workbook.getSheetAt(0);HSSFSheet sheet = wookbook.getSheet("Sheet1");//获取到Excel文件中的所有行数int rows = sheet.getPhysicalNumberOfRows();//遍历行for (int i = 0; i < rows; i++) {// 读取左上端单元格HSSFRow row = sheet.getRow(i);// 行不为空if (row != null) {//获取到Excel文件中的所有的列int cells = row.getPhysicalNumberOfCells();String value = "";//遍历列for (int j = 0; j < cells; j++) {//获取到列的值HSSFCell cell = row.getCell(j);if (cell != null) {switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_FORMULA:break;case HSSFCell.CELL_TYPE_NUMERIC:value += cell.getNumericCellValue() + ",";break;case HSSFCell.CELL_TYPE_STRING:value += cell.getStringCellValue() + ",";break;default:value += "0";break;}}}// 将数据插入到mysql数据库中String[] val = value.split(",");TestEntity entity = new TestEntity();//现在开始数据转换啦!!!!!!*************************************************double a = Double.parseDouble(val[0]);long code = (long)a;entity.setNum1(code);entity.setNum2(val[1]);entity.setNum3(val[2]);entity.setNum4(val[3]);entity.setNum5(val[4]);entity.setNum6(val[5]);TestMethod method = new TestMethod();method.Add(entity);}}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}我们的数据库实在是太复杂,所以这个方法bye-bye了!!!二.手动进行Excel数据和MySql数据转换这个方法也是从网上查到的,比第一种要简单一些,一个命令就搞定,下面copy给大家:假如要把如图所示的Excel表格导入到MySql数据库中,如图:,步骤一:选取要导入的数据快儿,另外要多出一列,如下图:步骤二:将选中的数据快儿拷贝到一个新建的表格工作薄,然后“另存为” -》“文本文件(制表符分割)(*.txt)”,假如存到“D:data.txt”这个位置里。
Excel通过POI大数据导入数据库通用方案
目录一、总体设计思路错误!未指定书签。
二、导入规则表设计错误!未指定书签。
1、数据导入表规则错误!未指定书签。
2、数据导入列规则错误!未指定书签。
三、导入规则类设计错误!未指定书签。
四、界面设计错误!未指定书签。
1、规则配置界面错误!未指定书签。
2、导入数据界面错误!未指定书签。
五、导入逻辑错误!未指定书签。
六、内部评审补充错误!未指定书签。
此文档仅为设计方案,如要查看具体实现,请联系我所要源码通用导入设计方案一、总体设计思路考虑到导入在项目中应用较多,随后其他项目中都会用到,为了减少重复工作,不必因为的样式、数据等变化而重新编码,重复劳动,因此必须抽取通用的东西出来,封装共同点,暴露个性点,使用时只需要关注相关业务,而不必关注的读取和存储。
考虑到这个情况,可以使用规则配置来解决这个问题。
配置规则的时候,需要配置要导入的表,字段等信息,导入的时候依据这个规则将数据导入到数据库中。
这样一来,在进行导入时候只需要为某种数据配置一个规则,然后调用封装的导入类就可以完成整个导入的工作了。
实现源码参见二、导入规则表设计1、数据导入表规则(1):数据表唯一标识,没有业务含义;(2):创建时间;(3):规则名称;(4):数据读取结束标识,标识遇到空行结束,数字N表示读取到第N行结束;(5):标题行索引,默认值为1,表示第一行是标题行;(6):数据开始行索引,默认值为2,表示第2行开始是正式数据;(7):表名称,表示这个规则是针对这个表的数据导入定义的;(8):是否删除重复行,即是否导入重复数据,0则不删除,直接导入,1则先删除重复数据,然后再导入;是否重复根据规则表的字段来判定,重复行是指数据库中存在及中相同的数据;(9):有效标识;2、数据导入列规则(1):数据表唯一标识,没有业务含义;(2):表的主键,表示这条列规则是属于哪个表的规则;(3):是否是主键;(4):数据生成策略,导入数据/自定义策略/默认值,三种策略供选择;(5):是否唯一,用来判定重复数据;(6):列名称,对应表中的列名;(7):列标题,及数据表列是对应的;(8):是否必须导入,0不必须1必须;(9):数据类型,数字还是字符,;(10):最大允许长度,不能大于,数据表中该列的长度;(11):数据生成策略值,导入数据是为空,自定义策略是为策略方法名,或者是默认值;(12):备注;(13):最终导入数据是否来源于字典,0不1是;(14):字典数据来源表的名称;(15):字典类型列的字段名;(16):该列所属的字典类型值;(17):字典表最终获取值列的名称,例如:现在需要导入“编码器类型”,内容是“飞利浦”,“编码器类型”是一个字典,对应的字典表是“”,“飞利浦”是“”列的值,而数据表需要存入的是“”列的值,这时“”就是,而“”就是,“”是;(18):参见第17条说明。
通过excel将数据插入到数据库中
以前老师让我们将学到的东西写成日志分享出来,可以巩固知识,可以相互交流,可以当做自己的资料库,今天学得到一点,整理出来,今后有时间要多整理。
用于将找到的一些文本数据插入到数据库中.需用到microoffice的excel和相关数据库。
事件:如图1我需要将这些world文档中的数据导入到数据库的一个数据表base_cu中思想:因为将要导入的数据有三千多条,所以逐条录入是不可能的。
这个方法的思想是将wold内容复制到excel中,然后通过excel表格将这些数据批量做成sql的插入语句。
对于这个数据表插入语句应该是这个样的:insert into `base_cultivateunit` (`culUnitId`, `culUnitCode`, `culUnitName`) values('','10001','北京大学');culUnitld这个字段设为空,因为它为自增长类型且文档中没有他的相关信息。
方法:将world文档中的所需要的数据(代码和院校)选中复制,新建一个excel文件拷贝到其中,如图如图,这样就开始制作sql语句了,鼠标选中第H列的第一格,然后点击上图中红框圈中的按钮(插入函数按钮),将用它来完成语句格式,弹出如下图提示框图中选择类别为文本,选择函数为CONCATENTE,如红框所标记,点击确定弹出图如下在此框中完善Text1等内容。
你需要以下格式的数据insert into `base_cultivateunit` (`culUnitId`, `culUnitCode`, `culUnitName`) values('','10001','北京大学');而excel中有 100001 和北京大学这两段数据,剩下的需要由你来完善,因此Text1中输入:insert into `base_cultivateunit` (`culUnitId`, `culUnitCode`, `culUnitName`) values('','Text2中输入:E1Text3中输入:','Text4中输入:G1Text5中输入:');然后点击确定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一、总体设计思路........................................................................................................ - 1 -二、导入规则表设计.................................................................................................... - 1 -1、数据导入表规则.................................................................................................... - 1 -2、数据导入列规则.................................................................................................... - 2 -三、导入规则类设计.................................................................................................... - 3 -四、界面设计................................................................................................................ - 4 -1、规则配置界面........................................................................................................ - 4 -2、导入数据界面........................................................................................................ - 6 -五、导入逻辑................................................................................................................ - 7 -六、内部评审补充........................................................................................................ - 8 -此文档仅为设计方案,如要查看具体实现,请联系我所要源码通用Excel导入设计方案一、总体设计思路考虑到Excel导入在项目中应用较多,随后其他项目中都会用到,为了减少重复工作,不必因为excel的样式、数据等变化而重新编码,重复劳动,因此必须抽取通用的东西出来,封装共同点,暴露个性点,使用时只需要关注相关业务,而不必关注excel的读取和存储。
考虑到这个情况,可以使用规则配置来解决这个问题。
配置规则的时候,需要配置excel要导入的表,字段等信息,导入的时候依据这个规则将数据导入到数据库中。
这样一来,在进行excel导入时候只需要为某种数据配置一个规则,然后调用封装的导入类就可以完成整个excel导入的工作了。
实现源码参见/detail/whatismvc/3696185二、导入规则表设计1、数据导入表规则(1)ID:数据表唯一标识,没有业务含义;(2)Create_time:创建时间;(3)Rule_name:规则名称;(4)End_row:数据读取结束标识,blank_row标识遇到空行结束,数字N表示读取到第N行结束;(5)Header_index:excel标题行索引,默认值为1,表示第一行是标题行;(6)Data_index:数据开始行索引,默认值为2,表示第2行开始是正式数据;(7)Table_name:表名称,表示这个规则是针对这个表的数据导入定义的;(8)Delete_repeat:是否删除重复行,即是否导入重复数据,0则不删除,直接导入,1则先删除重复数据,然后再导入;是否重复根据规则表data_import_column_rule的Is_unique字段来判定,重复行是指数据库中存在与excel中相同的数据;(9)Enable:有效标识;2、数据导入列规则(1)ID:数据表唯一标识,没有业务含义;(2)Table_rule_id:data_import_table_rule表的主键,表示这条列规则是属于哪个表的规则;(3)Is_PK:是否是主键;(4)Produce_method:数据生成策略,导入数据/自定义策略/默认值,三种策略供选择;(5)Is_unique:是否唯一,用来判定重复数据;(6)Column_name:列名称,对应表中的列名;(7)Header_name:excel列标题,与数据表列是对应的;(8)Required:是否必须导入,0不必须1必须;(9)Data_type:数据类型,数字还是字符,number/string/date;(10)Max_length:最大允许长度,不能大于,数据表中该列的长度;(11)Produce_method_value:数据生成策略值,导入数据是为空,自定义策略是为策略方法名,或者是默认值;(12)Comment:备注;(13)Is_dictionary:最终导入数据是否来源于字典,0不1是;(14)Dic_table_name:字典数据来源表的名称;(15)Dic_type_column:字典类型列的字段名;(16)Dic_type_value:该列所属的字典类型值;(17)Dic_required_column:字典表最终获取值列的名称,例如:现在需要导入“编码器类型”,excel内容是“飞利浦”,“编码器类型”是一个字典,对应的字典表是“video_coding_type”,“飞利浦”是“video_coding_type_name”列的值,而数据表需要存入的是“video_coding_type_id”列的值,这时“video_coding_type_id”就是Dic_required_column,而“video_coding_type_name”就是Dic_reference_column,“video_coding_type”是Dic_table_name;(18)Dic_reference_column:参见第17条说明。
(19)Enable:该规则是否有效;三、导入规则类设计class ImportResult {private int success;//成功数目private int failed;//失败数目}class Excel {private DataImportTableRule tableRule;public Excel(String path){…}public ImportResult import(){…}}class DataImportTableRule {private String id;private Date createTime;private String ruleName;private String endRow;private int headerIndex;private int dataIndex;private String tableName;private boolean deleteRepeat;private String exceptColumns;private Set ColumnRules;public void initColumnRules(){…}public void addColumnRule(DataImportColumnRule columnRule){…} }class DataImportColumnRule {private String id;private String tableRuleId;private boolean isUnique;private String columnName;private String headerName;private boolean required;private String dataType;private String maxLength;private String defaultValue;private String comment;private boolean isDictionary;private String dicTableName;private String dicTypeColumn;private String dicTypeValue;private String dicRequiredColumn;private String dicReferenceColumn;}四、界面设计1、规则配置界面2、导入数据界面五、导入逻辑关于Excel操作,设计将采用apache的poi组件,版本采用项目lib中已经包含的版本poi-2.5.1。
具体导入逻辑如下:1、将excel文件上传到web服务器,利用poi加载excel文件。
2、根据用户选择的导入规则,从数据库加载对应的DataImportTableRule对象;3、根据标题行索引Header_index,数据开始行索引Data_index,结束行标识End_row,判断该excel是否满足对应规则的导入条件,满足则继续,不满足则给出提示信息。
4、从数据开始行Data_index开始,逐行读取excel文件。
5、处理excel第一列,根据excel第一列的标题以及header_name属性,匹配到对应的DataImportColumnRule对象,如果没有匹配的对象,则抛出异常(未找到与之匹配的列规则),如果该列已经处理过,也抛出异常(excel标题存在重复列),否则继续;6、读取Excel当前列的内容text,如果text是空值,判断Required属性是否为true,如果是false,则将defaultValue属性作为excel内容text直接执行第11条,如果是true则继续;7、判断Is_dictionary属性是否为true,如果为false,则跳过8、9逻辑,直接执行第10条,如果为true,则继续;8、判断Dic_table_name属性、Dic_type属性、Dic_required_column属性以及Dic_reference_column属性,若其中有任意一个为null或空值,则抛出异常(属于字典,却未指定字典表名称Dic_table_name以及相关属性Dic_type、Dic_required_column、Dic_reference_column),否则继续;9、查找字典表,查找语句为”select [Dic_required_column] from [Dic_table_name]where [Dic_type_column]=[Dic_type_value] and [Dic_Reference_column]=’[text]’”,若sql语句不能查询到数据,则抛出异常(找不到对应的字典项),若查询到数据,则取第一条数据的[Dic_required_column]值,继续;10、判断Is_unique属性是否为true,若为false,执行第11条,若为true,则查找表[Table_name]中[Column_name]值为[text]的数据是否存在,若不存在则执行第11条,否则继续判断Delete_repeat属性是否为true,若为true则删除数据库中该条数据;11、判断Data_type属性,并判断text与该类型是否匹配,若不匹配,则抛出异常(数据类型不符合条件),如果匹配则继续;12、判断text长度是否超过Max_length属性值,若超过,则抛出异常(单元格内容长度太大),否则继续;13、将text作为Column_name列的值,加到准备好的sql语句对应参数位置,等待执行;14、处理excel第二列,从第5条开始执行循环处理,直到Excel列结束;15、执行或批量执行准备好的sql语句,返回执行结果;16、处理excel第二行,并判断是否符合End_row的条件,如果是结束行,则整个导入结束,否则从第4条开始执行循环处理,直到End_row结束。