jAVA批量导入excel数据代码示例
Java中Easypoi实现excel多sheet表导入导出功能
Java中Easypoi实现excel多sheet表导⼊导出功能Easypoi简化了开发中对⽂档的导⼊导出实现,并不像poi那样都要写⼤段⼯具类来搞定⽂档的读写。
第⼀步引⼊Easypoi依赖<!-- 导出⽂件⼯具 EasyPoi实现Excel读写管理测试⽤例 --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.2.0</version></dependency>Easypoi的注解使⽤说明(存留查看即可)第⼆步定义对应表格头数据对象实体类(注解的使⽤可以查阅上⾯的按需使⽤即可)@Setter@Getter@ToStringpublic class LoginCaseDto {@Excel(name = "flag(0是反向,1是正向)",orderNum = "1",width = 20)private String flag;@Excel(name = "urlid(访问id)",orderNum = "2",width = 20)private String urlid;@Excel(name = "name(登录账号)",orderNum = "3",width = 20)private String name;@Excel(name = "pwd(登录密码)",orderNum = "4",width = 20)private String pwd;@Excel(name = "desc(期望提⽰语)",orderNum = "5",width = 40)private String desc;@Excel(name = "actual(实际测试结果)",orderNum = "6",width = 40 )private String actual;@Excel(name = "urlpath(被测路径)",orderNum = "7",width = 40 )private String urlpath;}public class LoginUrlDto {@Excel(name = "id(访问测试类型)",orderNum = "1",width = 20)private String id;@Excel(name = "type(请求类型)",orderNum = "2",width = 20)private String type;@Excel(name = "url(访问地址)",orderNum = "3",width = 40)private String url;}第三步:封装Easypoi⼯具类(⽹上查了很多但是并不完整,这⾥补充下)关键封装⼯具类多sheet导⼊⽅法/*** 功能描述:根据接收的Excel⽂件来导⼊多个sheet,根据索引可返回⼀个集合* @param filePath 导⼊⽂件路径* @param sheetIndex 导⼊sheet索引* @param titleRows 表标题的⾏数* @param headerRows 表头⾏数* @param pojoClass Excel实体类* @return*/public static <T> List<T> importExcel(String filePath,int sheetIndex,Integer titleRows, Integer headerRows, Class<T> pojoClass) {// 根据file得到Workbook,主要是要根据这个对象获取,传过来的excel有⼏个sheet页ImportParams params = new ImportParams();// 第⼏个sheet页params.setStartSheetIndex(sheetIndex);params.setTitleRows(titleRows);params.setHeadRows(headerRows);List<T> list = null;try {list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);} catch (NoSuchElementException e) {throw new RuntimeException("模板不能为空");} catch (Exception e) {e.printStackTrace();}return list;}excel导⼊⽰例(直接传⼊sheet索引获取对应的sheet表)多sheet表导出⽅法使⽤(需要把导⼊的多sheet表数据转成list集合获取新数据后调⽤该⽅法重新写⼊)/*** 功能描述:把同⼀个表格多个sheet测试结果重新输出,如果后续增加多个List<Map<String, Object>>对象,需要后⾯继续追加* @ExcelEntiry sheet表格映射的实体对象* @return*/public static String exportSheet( Object...objects){Workbook workBook = null;try {// 创建参数对象(⽤来设定excel得sheet得内容等信息)ExportParams deptExportParams = new ExportParams();// 设置sheet得名称deptExportParams.setSheetName("登录⽤例");// 设置sheet表头名称deptExportParams.setTitle("测试⽤例");// 创建sheet1使⽤得mapMap<String, Object> deptExportMap = new HashMap<>();// title的参数为ExportParams类型,⽬前仅仅在ExportParams中设置了sheetNamedeptExportMap.put("title", deptExportParams);// 模版导出对应得实体类型deptExportMap.put("entity", LoginCaseDto.class);// sheet中要填充得数据deptExportMap.put("data", objects[0]);ExportParams empExportParams = new ExportParams();empExportParams.setTitle("被测RUL路径");empExportParams.setSheetName("被测url");// 创建sheet2使⽤得mapMap<String, Object> empExportMap = new HashMap<>();empExportMap.put("title", empExportParams);empExportMap.put("entity", LoginUrlDto.class);empExportMap.put("data", objects[1]);// 将sheet1、sheet2使⽤得map进⾏包装List<Map<String, Object>> sheetsList = new ArrayList<>();sheetsList.add(deptExportMap);sheetsList.add(empExportMap);// 执⾏⽅法workBook = EasyPoiUtil.exportExcel(sheetsList, ExcelType.HSSF);//String fileName = URLEncoder.encode("test", "UTF-8");String filepath = (String) LoadStaticConfigUtil.getCommonYml( "testcaseexcel.cases");FileOutputStream fos = new FileOutputStream(filepath);workBook.write(fos);fos.close();}catch (Exception e){e.printStackTrace();}finally {if(workBook != null) {try {workBook.close();} catch (IOException e) {e.printStackTrace();}}}return "success";}最后即可获取新的测试结果表格。
java导入excel表格
1 从Excel文件读取数据表Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。
读取Excel数据表的第一步是创建Workbook(术语:工作薄),下面的代码片段举例说明了应该如何操作:(完整代码见ExcelReading.java)一旦创建了Workbook,我们就可以通过它来访问Excel Sheet(术语:工作表)。
参考下面的代码片段:我们既可能通过Sheet的名称来访问它,也可以通过下标来访问它。
如果通过下标来访问的话,要注意的一点是下标从0开始,就像数组一样。
一旦得到了Sheet,我们就可以通过它来访问Excel Cell(术语:单元格)。
参考下面的代码片段:如果仅仅是取得Cell的值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回。
示例代码中Cell(0, 0)是文本型,Cell(1, 0)是数字型,Cell(1,1)是日期型,通过getContents(),三种类型的返回值都是字符型。
如果有需要知道Cell内容的确切类型,API也提供了一系列的方法。
参考下面的代码片段:在得到Cell对象后,通过getType()方法可以获得该单元格的类型,然后与API 提供的基本类型相匹配,强制转换成相应的类型,最后调用相应的取值方法getXXX(),就可以得到确定类型的值。
API提供了以下基本类型,与Excel的数据格式相对应,如下图所示:每种类型的具体意义,请参见Java Excel API Document。
当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。
参考如下代码片段:Java Excel API提供了许多访问Excel数据表的方法,在这里我只简要地介绍几个常用的方法,其它的方法请参考附录中的Java Excel API Document。
easypoi一行代码搞定excel导入导出
easypoi⼀⾏代码搞定excel导⼊导出开发中经常会遇到excel的处理,导⼊导出解析等等,java中⽐较流⾏的⽤poi,但是每次都要写⼤段⼯具类来搞定这事⼉,此处推荐⼀个别⼈造好的轮⼦【easypoi】,下⾯介绍下“轮⼦”的使⽤。
pom不再需要其他jar <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.0.3</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.0.3</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.0.3</version></dependency>此处注意必须要有空构造函数,否则会报错“对象创建错误”关于注解@Excel,其他还有@ExcelCollection,@ExcelEntity ,@ExcelIgnore,@ExcelTarget等,此处我们⽤不到,可以去官⽅查看更多属性类型类型说明name String null列名needMerge boolean fasle纵向合并单元格orderNum String"0"列的排序,⽀持name_idreplace String[]{}值得替换导出是{a_id,b_id} 导⼊反过来savePath String"upload"导⼊⽂件保存路径type int1导出类型 1 是⽂本 2 是图⽚,3 是函数,10 是数字默认是⽂本width double10列宽height double10列⾼,后期打算统⼀使⽤@ExcelTarget的height,这个会被废弃,注意isStatistics boolean fasle⾃动统计数据,在追加⼀⾏统计,把所有数据都和输出这个处理会吞没异常,请注意这⼀点isHyperlink boolean false超链接,如果是需要实现接⼝返回对象isImportField boolean true校验字段,看看这个字段是不是导⼊的Excel中有,如果没有说明是错误的Excel,读取失败,⽀持name_id exportFormat String""导出的时间格式,以这个是否为空来判断是否需要格式化⽇期importFormat String""导⼊的时间格式,以这个是否为空来判断是否需要格式化⽇期format String""时间格式,相当于同时设置了exportFormat 和 importFormatdatabaseFormat String"yyyyMMddHHmmss"导出时间设置,如果字段是Date类型则不需要设置数据库如果是string 类型,这个需要设置这个数据库格式,⽤以转换时间格式输出numFormat String""数字格式化,参数是Pattern,使⽤的对象是DecimalFormatimageType int1导出类型 1 从file读取 2 是从数据库中读取默认是⽂件同样导⼊也是⼀样的suffix String""⽂字后缀,如% 90 变成90%isWrap boolean true是否换⾏即⽀持\nmergeRely int[]{}合并单元格依赖关系,⽐如第⼆列合并是基于第⼀列则{1}就可以了mergeVertical boolean fasle纵向合并内容相同的单元格实体类:import cn.afterturn.easypoi.excel.annotation.Excel;import java.util.Date;public class Person {@Excel(name = "姓名", orderNum = "0")private String name;@Excel(name = "性别", replace = {"男_1", "⼥_2"}, orderNum = "1")private String sex;@Excel(name = "⽣⽇", exportFormat = "yyyy-MM-dd", orderNum = "2")private Date birthday;public Person(String name, String sex, Date birthday) { = name;this.sex = sex;this.birthday = birthday;}public String getName() {return name;}public void setName(String name) { = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}}public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName,boolean isCreateHeader, HttpServletResponse response){ ExportParams exportParams = new ExportParams(title, sheetName);exportParams.setCreateHeadRows(isCreateHeader);defaultExport(list, pojoClass, fileName, response, exportParams);}public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));}public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){defaultExport(list, fileName, response);}private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list);if (workbook != null);downLoadExcel(fileName, response, workbook);}private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));workbook.write(response.getOutputStream());} catch (IOException e) {throw new NormalException(e.getMessage());}}private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);if (workbook != null);downLoadExcel(fileName, response, workbook);}public static <T> List<T> importExcel(String filePath,Integer titleRows,Integer headerRows, Class<T> pojoClass){if (StringUtils.isBlank(filePath)){return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);List<T> list = null;try {list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);}catch (NoSuchElementException e){throw new NormalException("模板不能为空");} catch (Exception e) {e.printStackTrace();throw new NormalException(e.getMessage());}return list;}public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){if (file == null){return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);List<T> list = null;try {list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);}catch (NoSuchElementException e){throw new NormalException("excel⽂件不能为空");} catch (Exception e) {throw new NormalException(e.getMessage());}return list;}对的,没看错,这就可以导出导⼊了,看起来代码挺多,其实是提供了多个导⼊导出⽅法⽽已导出实现类,使⽤@ExcelTarget注解与@Excel注解:import cn.afterturn.easypoi.excel.ExcelExportUtil;import cn.afterturn.easypoi.excel.ExcelImportUtil;import cn.afterturn.easypoi.excel.annotation.Excel;import cn.afterturn.easypoi.excel.entity.ExportParams;import cn.afterturn.easypoi.excel.entity.ImportParams;import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;import com.fasterxml.jackson.annotation.JsonFormat;import com.jn.ssr.superrescue.annotation.Translate;import com.jn.ssr.superrescue.cache.DictCache;import ng.StringUtils;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import ermodel.Workbook;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;import java.io.File;import ng.reflect.Field;import ng.reflect.InvocationHandler;import ng.reflect.Proxy;import .URLEncoder;import java.util.*;import java.util.stream.Collectors;public class FileUtil {private static Logger log = LogManager.getLogger(FileUtil.class);public static final int BIG_DATA_EXPORT_MIN = 50000;public static final int BIG_DATA_EXPORT_MAX = 2000000;//excel处理注解set集合public static HashSet<String> transClassSet = new HashSet();public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) { ExportParams exportParams = new ExportParams(title, sheetName);exportParams.setCreateHeadRows(isCreateHeader);defaultExport(list, pojoClass, fileName, response, title, sheetName);}/*** 导出函数** @param list 导出集合* @param title 标题* @param sheetName sheet名* @param pojoClass 映射实体* @param fileName ⽂件名* @param response httpresponce* size如果过⼤需采⽤poi SXSSF*/public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {//判断该类是否已经处理过excel注解long startTime = System.currentTimeMillis();if (!transClassSet.contains(String.valueOf(pojoClass))) {initProperties(pojoClass);transClassSet.add(String.valueOf(pojoClass));}defaultExport(list, pojoClass, fileName, response, title, sheetName);("此⽂件[{}]导出耗时:{}ms", fileName, (System.currentTimeMillis() - startTime));}public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {defaultExport(list, fileName, response);}private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, String title, String sheetName) {Workbook workbook = null;ExportParams exportParams = new ExportParams(title, sheetName);if (list != null && list.size() > BIG_DATA_EXPORT_MAX) {sizeBeyondError(response);return;} else if (list != null && list.size() > BIG_DATA_EXPORT_MIN) {("⽂件过⼤采⽤⼤⽂件导出:" + list.size());for (int i = 0; i < (list.size() / BIG_DATA_EXPORT_MIN + 1) && list.size() > 0; i++) {("当前切⽚:" + i * BIG_DATA_EXPORT_MIN + "-" + (i + 1) * BIG_DATA_EXPORT_MIN);List<?> update = list.stream().skip(i * BIG_DATA_EXPORT_MIN).limit(BIG_DATA_EXPORT_MIN).collect(Collectors.toList());exportParams.setCreateHeadRows(true);exportParams.setMaxNum(BIG_DATA_EXPORT_MIN * 2 + 2);workbook = ExcelExportUtil.exportBigExcel(exportParams, pojoClass, update);}ExcelExportUtil.closeExportBigExcel();workbook = ExcelExportUtil.exportExcel(new ExportParams(title, sheetName), pojoClass, list);}if (workbook == null) return;downLoadExcel(fileName, response, workbook);}private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) { try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));// workbooks.forEach(e -> e.write(response.getOutputStream()));workbook.write(response.getOutputStream());} catch (Exception e) {e.printStackTrace();response.setCharacterEncoding("UTF-8");response.setContentType("application/json");try {response.getWriter().println("{\"code\":597,\"message\":\"export error!\",\"data\":\"\"}");response.getWriter().flush();} catch (Exception e1) {e1.printStackTrace();} finally {closeIo(response);}}}/*** ⽂件过⼤,不允许导出** @param response*/private static void sizeBeyondError(HttpServletResponse response) {response.setCharacterEncoding("UTF-8");response.setContentType("application/json");try {response.getWriter().println("{\"code\":599,\"message\":\"⽂件过⼤!\",\"data\":\"\"}");response.getWriter().flush();} catch (Exception e1) {e1.printStackTrace();} finally {closeIo(response);}}private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponseresponse) {Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);if (workbook != null) ;downLoadExcel(fileName, response, workbook);}public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) { if (StringUtils.isBlank(filePath)) {return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);List<T> list = null;try {list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);} catch (NoSuchElementException e) {e.printStackTrace();System.out.println("模版为空");} catch (Exception e) {e.printStackTrace();}return list;}public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) { if (file == null) {return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);List<T> list = null;try {list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);} catch (NoSuchElementException e) {e.printStackTrace();System.out.println("⽂件为空");} catch (Exception e) {e.printStackTrace();}}/*** 代理初始化该类的注解** @param cl*/public synchronized static void initProperties(Class cl) {try {Field[] fields = cl.getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(Excel.class)) {field.setAccessible(true);Excel excel = field.getAnnotation(Excel.class);InvocationHandler h = Proxy.getInvocationHandler(excel);Field hField = h.getClass().getDeclaredField("memberValues");// 因为这个字段事 private final 修饰,所以要打开权限hField.setAccessible(true);// 获取 memberValuesMap memberValues = (Map) hField.get(h);//判断是否有转义注解,将字典添加到excel replace属性中if (field.isAnnotationPresent(Translate.class)) {Translate translate = field.getAnnotation(Translate.class);String dicName = translate.dicName();Map dicMap = DictCache.getProperties(dicName);if (dicMap == null) {continue;}String[] replace = new String[dicMap.size()];List<String> replaceList = new ArrayList<>();dicMap.forEach((key, val) -> {replaceList.add(val + "_" + key);});for (int i = 0; i < dicMap.size(); i++) {replace[i] = replaceList.get(i);}memberValues.put("replace", replace);}//json格式化与JsonFormat统⼀,⽬前暂⽤于时间if (field.isAnnotationPresent(JsonFormat.class)) {JsonFormat jsonFormat = field.getAnnotation(JsonFormat.class);if (StringUtils.isNotEmpty(jsonFormat.pattern())) {memberValues.put("format", jsonFormat.pattern());}}}}} catch (Exception e) {e.printStackTrace();}}/*** 关闭writer** @param response*/private static void closeIo(HttpServletResponse response) {try {if (response.getWriter() != null) {response.getWriter().close();}} catch (Exception e) {e.printStackTrace();}}}使⽤VUE前端数据导出实现类:import excel from '../../../utils/export'var exportExcel = {};exportExcel.exportData=function (params) {var str = '&';for(key in params){str+= key+'='+params[key]+'&';}//alert(nodePath+'/export?token='+er+str);console.log(nodePath+'/export?token='+er+str);window.location.href = nodePath+'/export?token='+er+str; }module.exports = exportExcel;在VUE页⾯中的导出:exportExcel(){console.log(22222);let param = {url: '/automaticCar/export',params:JSON.stringify(this.ruleForm)excel.exportData(param);},@RequestMapping("export")public void export(HttpServletResponse response){//模拟从数据库获取需要导出的数据List<Person> personList = new ArrayList<>();Person person1 = new Person("路飞","1",new Date());Person person2 = new Person("娜美","2", DateUtils.addDate(new Date(),3));Person person3 = new Person("索隆","1", DateUtils.addDate(new Date(),10));Person person4 = new Person("⼩狸猫","1", DateUtils.addDate(new Date(),-10));personList.add(person1);personList.add(person2);personList.add(person3);personList.add(person4);//导出操作FileUtil.exportExcel(personList,"花名册","草帽⼀伙",Person.class,"海贼王.xls",response);}@RequestMapping("importExcel")public void importExcel(){String filePath = "F:\\海贼王.xls";//解析excel,List<Person> personList = FileUtil.importExcel(filePath,1,1,Person.class);//也可以使⽤MultipartFile,使⽤ FileUtil.importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass)导⼊ System.out.println("导⼊数据⼀共【"+personList.size()+"】⾏");//TODO 保存数据库}导出结果导出结果测试导⼊导出结果再添加⼀⾏,执⾏,输出导⼊数据⾏数。
解决Java导入excel大量数据出现内存溢出的问题
解决Java导⼊excel⼤量数据出现内存溢出的问题问题:系统要求导⼊40万条excel数据,采⽤poi⽅式,服务器出现内存溢出情况。
解决⽅法:由于HSSFWorkbook workbook = new HSSFWorkbook(path)⼀次性将excel load到内存中导致内存不够。
故采⽤读取csv格式。
由于csv的数据以x1,x2,x3形成,类似读取txt⽂档。
private BufferedReader bReader;/*** 执⾏⽂件⼊⼝*/public void execute() {try {if(!path.endsWith(".csv")){("-----该⽂件不是以CSV⽂件,请上传正确的⽂件格式------");return ;}Long startTime = System.currentTimeMillis();("------开始执⾏定时任务,时间=" + startTime);readCSV(path);Long endTime = System.currentTimeMillis();("------结束定时任务,时间=" + endTime + "---耗时="+ (endTime - startTime));} catch (Exception e) {e.printStackTrace();}}/*** 读取csv并处理数据* @param path* @throws Exception*/private void readCSV(String path) throws Exception {File file = new File(path);try {bReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "gbk"));String line = "";//忽略第⼀⾏标题for (int i = 0; i < 1; i++) {line = bReader.readLine();}while((line = bReader.readLine()) != null){if (line.trim() != "") {//分割开来的即是对应的每个单元格,注意空的情况String[] result = line.split(",");}}}} finally {if (bReader != null) {bReader.close();}}}以上这篇解决Java导⼊excel⼤量数据出现内存溢出的问题就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
java实现导出Excel(跨行跨列)
java实现导出Excel(跨行跨列)在Java中,可以使用Apache POI库来实现导出Excel文件,并且可以实现跨行和跨列的功能。
Apache POI是一个开源的Java库,可以处理Microsoft Office格式的文档,包括Excel。
以下是使用Apache POI库实现导出Excel文件的步骤:1. 首先,需要引入Apache POI依赖。
可以在Maven或Gradle中添加以下依赖项:```xml<!-- Apache POI --><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>2. 创建一个Workbook对象,该对象代表一个Excel文件:```javaWorkbook workbook = new XSSFWorkbook(;```3. 创建一个Sheet对象,该对象代表Excel文件中的一个工作表:```javaSheet sheet = workbook.createSheet("Sheet1");```4. 创建行和单元格,根据需要设置跨行和跨列的属性。
可以使用CellRangeAddress类来实现跨行和跨列的功能:```javaRow row = sheet.createRow(0);Cell cell = row.createCell(0);cell.setCellValue("跨行跨列");//合并单元格,从第1行到第3行,从第1列到第5列CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 2, 0, 4);sheet.addMergedRegion(cellRangeAddress);5. 将数据写入Excel文件中的单元格:```javaRow row = sheet.createRow(0);Cell cell = row.createCell(0);cell.setCellValue("Hello");```6. 将Workbook对象写入到文件中:```javaFileOutputStream fileOutputStream = new FileOutputStream("output.xlsx");workbook.write(fileOutputStream);fileOutputStream.close(;```完整的示例代码如下所示:```javaimport ermodel.*;import org.apache.poi.ss.util.CellRangeAddress;import ermodel.XSSFWorkbook;import java.io.FileOutputStream;import java.io.IOException;public class ExcelExporterpublic static void main(String[] args) throws IOExceptionWorkbook workbook = new XSSFWorkbook(;Sheet sheet = workbook.createSheet("Sheet1");Row row = sheet.createRow(0);Cell cell = row.createCell(0);cell.setCellValue("跨行跨列");//合并单元格,从第1行到第3行,从第1列到第5列CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 2, 0, 4);sheet.addMergedRegion(cellRangeAddress);FileOutputStream fileOutputStream = newFileOutputStream("output.xlsx");workbook.write(fileOutputStream);fileOutputStream.close(;System.out.println("Excel文件导出成功!");}```执行该代码后,会在项目的根目录下生成一个名为`output.xlsx`的Excel文件,其中包含一个跨行和跨列的单元格。
exportbigexcel 用法
exportbigexcel 用法ExportBigExcel是一个基于Java的开源项目,用于将大量数据导出到Excel文件中。
它提供了方便的方式来处理大型数据集,并将其转换为可读取和分析的Excel文件。
在本文中,我们将详细讨论ExportBigExcel项目的用法,解释其核心功能,以及提供一些示例代码来帮助你更好地理解和应用这个项目。
一、导入ExportBigExcel要使用ExportBigExcel项目,首先我们需要将其导入到我们的Java项目中。
我们可以通过以下方式来实现:1. 在pom.xml文件中添加ExportBigExcel的依赖项:xml<dependency><groupId>com.github.export-big-excel</groupId><artifactId>export-big-excel</artifactId><version>1.0.0</version></dependency>2. 或者,您可以从项目的GitHub存储库中下载ExportBigExcel的JAR文件,并将其添加到您的项目中。
在完成导入过程后,我们就可以开始使用ExportBigExcel项目了。
二、创建数据模型在使用ExportBigExcel将数据导出到Excel文件之前,我们需要先创建一个数据模型。
数据模型是一个POJO类,定义了我们要导出的数据的字段和属性。
例如,如果我们要导出一个学生信息列表,我们可以创建一个名为Student的类,如下所示:javapublic class Student {private String name;private int age;private String grade;省略构造函数、getter和setter方法}在这个例子中,我们定义了学生的姓名、年龄和班级等属性。
Java实现大批量数据导入导出(100W以上) -(二)导出
Java实现⼤批量数据导⼊导出(100W以上) -(⼆)导出使⽤POI或JXLS导出⼤数据量(百万级)Excel报表常常⾯临两个问题:1. 服务器内存溢出;2. ⼀次从数据库查询出这么⼤数据,查询缓慢。
当然也可以分页查询出数据,分别⽣成多个Excel打包下载,但这种⽣成还是很缓慢。
⼤数据量导⼊请参考:那么如何解决呢?我们可以借助XML格式利⽤模板替换,分页查询出数据从磁盘写⼊XML,最终会以Excel多sheet形式⽣成。
亲测2400万⾏数据,⽣成Excel⽂件4.5G,总耗时1.5分钟。
我利⽤StringTemplate模板解析技术对XML模板进⾏填充。
当然也可以使⽤FreeMarker, Velocity等Java模板技术实现。
⾸先引⼊StringTemplate所需Jar包:使⽤技术为 stringTemplatepom.xml:1 <dependency>2<groupId>antlr</groupId>3<artifactId>antlr</artifactId>4<version>2.7.7</version>5</dependency>67<dependency>8<groupId>org.antlr</groupId>9<artifactId>stringtemplate</artifactId>10<version>3.2.1</version>11</dependency>⾸先准备导出Excel模板,然后打开-》另存为-》选择格式为XML,然后⽤⽂本打开XML,提取XML头模板(head.st可通⽤),数据体模板(boday.st):head.st可通⽤:1<?xml version="1.0"?>2<?mso-application progid="Excel.Sheet"?>3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"4 xmlns:o="urn:schemas-microsoft-com:office:office"5 xmlns:x="urn:schemas-microsoft-com:office:excel"6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"7 xmlns:html="/TR/REC-html40">8<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">9<Created>1996-12-17T01:32:42Z</Created>10<LastSaved>2013-08-02T09:21:24Z</LastSaved>11<Version>11.9999</Version>12</DocumentProperties>13<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">14<RemovePersonalInformation/>15</OfficeDocumentSettings>16<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">17<WindowHeight>4530</WindowHeight>18<WindowWidth>8505</WindowWidth>19<WindowTopX>480</WindowTopX>20<WindowTopY>120</WindowTopY>21<AcceptLabelsInFormulas/>22<ProtectStructure>False</ProtectStructure>23<ProtectWindows>False</ProtectWindows>24</ExcelWorkbook>25<Styles>26<Style ss:ID="Default" ss:Name="Normal">27<Alignment ss:Vertical="Bottom"/>28<Borders/>29<Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>30<Interior/>31<NumberFormat/>32<Protection/>33</Style>34</Styles>boday.st:1 $worksheet:{2<Worksheet ss:Name="$it.sheet$">3<Table ss:ExpandedColumnCount="$it.columnNum$" ss:ExpandedRowCount="$it.rowNum$" x:FullColumns="1"4 x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">5 $it.rows:{6<Row>7<Cell><Data ss:Type="String">$1$</Data></Cell>8<Cell><Data ss:Type="String">$2$</Data></Cell>9<Cell><Data ss:Type="String">$3$</Data></Cell>10</Row>11 }$12</Table>13</Worksheet>14 }$⽣成⼤数据量Excel类:ExcelGenerator:1package test.exportexcel;23import org.antlr.stringtemplate.StringTemplate;4import org.antlr.stringtemplate.StringTemplateGroup;5import test.exportexcel.bean.Row;6import test.exportexcel.bean.Worksheet;78import java.io.*;9import java.util.ArrayList;10import java.util.List;11import java.util.Random;1213/**14 * 类功能描述:generator big data Excel15 *16 * @author WangXueXing create at 19-4-13 下午10:2317 * @version 1.0.018*/19public class ExcelGenerator {20public static void main(String[] args) throws FileNotFoundException{21 ExcelGenerator template = new ExcelGenerator();22 template.output2();23 }2425/**26 * ⽣成数据量⼤的时候,该⽅法会出现内存溢出27 * @throws FileNotFoundException28*/29public void output1() throws FileNotFoundException{30 StringTemplateGroup stGroup = new StringTemplateGroup("stringTemplate");31 StringTemplate st4 = stGroup.getInstanceOf("test/exportexcel/template/test");32 List<Worksheet> worksheets = new ArrayList<>();3334 File file = new File("/home/barry/data/output.xls");35 PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(file)));3637for(int i=0;i<30;i++){38 Worksheet worksheet = new Worksheet();39 worksheet.setSheet("第"+(i+1)+"页");40 List<Row> rows = new ArrayList<>();41for(int j=0;j<6000;j++){42 Row row = new Row();43 row.setName1("zhangzehao");44 row.setName2(""+j);45 row.setName3(i+" "+j);46 rows.add(row);47 }48 worksheet.setRows(rows);49 worksheets.add(worksheet);50 }5152 st4.setAttribute("worksheets", worksheets);53 writer.write(st4.toString());54 writer.flush();55 writer.close();56 System.out.println("⽣成excel完成");57 }5859/**60 * 该⽅法不管⽣成多⼤的数据量,都不会出现内存溢出,只是时间的长短61 * 经测试,⽣成2400万数据,2分钟内,4.5G⼤的⽂件,打开⼤⽂件就看内存是否⾜够⼤了62 * 数据量⼩的时候,推荐⽤JXLS的模板技术⽣成excel⽂件,谁⽤谁知道,⼤数据量可以结合该⽅法使⽤63 * @throws FileNotFoundException64*/65public void output2() throws FileNotFoundException{66long startTimne = System.currentTimeMillis();67 StringTemplateGroup stGroup = new StringTemplateGroup("stringTemplate");6869//写⼊excel⽂件头部信息70 StringTemplate head = stGroup.getInstanceOf("test/exportexcel/template/head");71 File file = new File("/home/barry/data/output.xls");72 PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(file)));73 writer.print(head.toString());74 writer.flush();7576int sheets = 400;77//excel单表最⼤⾏数是6553578int maxRowNum = 60000;7980//写⼊excel⽂件数据信息81for(int i=0;i<sheets;i++){82 StringTemplate body = stGroup.getInstanceOf("test/exportexcel/template/body");83 Worksheet worksheet = new Worksheet();84 worksheet.setSheet(" "+(i+1)+" ");85 worksheet.setColumnNum(3);86 worksheet.setRowNum(maxRowNum);87 List<Row> rows = new ArrayList<>();88for(int j=0;j<maxRowNum;j++){89 Row row = new Row();90 row.setName1(""+new Random().nextInt(100000));91 row.setName2(""+j);92 row.setName3(i+""+j);93 rows.add(row);94 }95 worksheet.setRows(rows);96 body.setAttribute("worksheet", worksheet);97 writer.print(body.toString());98 writer.flush();99 rows.clear();100 rows = null;101 worksheet = null;102 body = null;103 Runtime.getRuntime().gc();104 System.out.println("正在⽣成excel⽂件的 sheet"+(i+1));105 }106107//写⼊excel⽂件尾部108 writer.print("</Workbook>");109 writer.flush();110 writer.close();111 System.out.println("⽣成excel⽂件完成");112long endTime = System.currentTimeMillis();113 System.out.println("⽤时="+((endTime-startTimne)/1000)+"秒");114 }115 }定义JavaBean:WorkSheet.java:1package test.exportexcel.bean;23import java.util.List;45/**6 * 类功能描述:Excel sheet Bean7 *8 * @author WangXueXing create at 19-4-13 下午10:219 * @version 1.0.010*/11public class Worksheet {12private String sheet;13private int columnNum;14private int rowNum;15private List<Row> rows;1617public String getSheet() {18return sheet;19 }20public void setSheet(String sheet) {21this.sheet = sheet;22 }2324public List<Row> getRows() {25return rows;26 }27public void setRows(List<Row> rows) {28this.rows = rows;29 }3031public int getColumnNum() {32return columnNum;33 }34public void setColumnNum(int columnNum) {35this.columnNum = columnNum;36 }3738public int getRowNum() {39return rowNum;40 }41public void setRowNum(int rowNum) {42this.rowNum = rowNum;43 }44 }Row.java:1package test.exportexcel.bean;23/**4 * 类功能描述:Excel row bean5 *6 * @author WangXueXing create at 19-4-13 下午10:227 * @version 1.0.08*/9public class Row {10private String name1;11private String name2;12private String name3;1314public String getName1() {15return name1;16 }17public void setName1(String name1) {1 = name1;19 }2021public String getName2() {22return name2;23 }24public void setName2(String name2) {2 = name2;26 }2728public String getName3() {29return name3;30 }31public void setName3(String name3) {3 = name3;33 }34 }另附实现源码: 此外,⼤数据量并并且Excel列较多时,会出现内存溢出。
easy poi fe 用法
标题:EasyPOI FE 用法全面解析一、EasyPOI FE 简介EasyPOI FE 是一款非常便捷的 Excel 数据导入导出工具,在 Java 开发中被广泛应用。
它提供了简单、灵活的 API、高性能的导入导出功能,可以方便地完成 Excel 与 Java 对象的相互转换,极大地提高了开发效率。
二、EasyPOI FE 用法详解1. 导入 Excel 数据EasyPOI FE 提供了丰富的 API,可以轻松实现 Excel 数据的导入。
我们需要定义 Excel 模板,然后通过 EasyPOI FE 的 API 将 Excel 中的数据导入到 Java 对象中,代码示例:```java// 定义 Excel 模板对应的 Java 实体类public class User {Excel(name = "尊称", orderNum = "0")private String name;Excel(name = "芳龄", orderNum = "1")private Integer age;// 省略 getter 和 setter 方法}// 使用 EasyPOI FE 导入 Excel 数据InputStream inputStream = new FileInputStream("user.xlsx"); List<User> userList = EasyPoiFeUtil.importExcel(inputStream, User.class);```2. 导出数据到 Excel除了导入数据,EasyPOI FE 也支持将 Java 对象的数据导出到 Excel 中。
我们只需要定义好导出的数据集合,然后调用 EasyPOI FE 提供的API 即可,代码示例:```java// 准备导出的数据集合List<User> userList = new ArrayList<>();User user1 = new User("张三", 25);User user2 = new User("李四", 28);userList.add(user1);userList.add(user2);// 使用 EasyPOI FE 导出数据到 ExcelWorkbook workbook = EasyPoiFeUtil.exportExcel(userList, User.class);workbook.write(new FileOutputStream("user_export.xlsx"));```3. 自定义 Excel 样式EasyPOI FE 不仅提供了简单的数据导入导出功能,还支持自定义Excel 样式。
easyexcel 模板指令
easyexcel 模板指令EasyExcel是一款基于Java的Excel操作工具,具有简单易用、高性能、支持大数据量批量导出等特点。
本文将介绍EasyExcel模板指令的相关参考内容,帮助使用EasyExcel进行Excel模板操作的开发人员快速上手。
1. 模板导出EasyExcel提供了丰富的模板导出功能,几行代码就可以轻松实现将数据导出到Excel模板中。
以下是一个简单的示例代码:```java// 创建ExcelWriter对象ExcelWriter writer =EasyExcel.write("template.xlsx").withTemplate("dataTemplate.xls x").build();// 填充数据到模板中FillData fillData = new FillData();fillData.setName("John");fillData.setAge(25);fillData.setGender("Male");writer.fill(fillData, new FillConfig());// 关闭ExcelWriter对象,完成导出writer.finish();```在上述代码中,`ExcelWriter`是EasyExcel中用于处理Excel写入操作的核心类,`withTemplate`方法用于指定Excel模板文件,`fill`方法用于填充数据到Excel模板中,`Finish`方法用于关闭ExcelWriter对象并完成导出操作。
2. 模板导入除了导出功能,EasyExcel还提供了模板导入的功能,可以将Excel模板中的数据读取到Java对象中。
以下是一个简单的示例代码:```java// 创建ExcelReader对象ExcelReader reader =EasyExcel.read("template.xlsx").withTemplate("dataTemplate.xlsx ").build();// 读取数据到Java对象中List<FillData> dataList = reader.read(FillData.class, new FillConfig());// 关闭ExcelReader对象reader.finish();// 打印读取到的数据for (FillData data : dataList) {System.out.println(data.getName() + ", " + data.getAge() + ", "+ data.getGender());}```在上述代码中,`ExcelReader`是EasyExcel中用于处理Excel读取操作的核心类,`read`方法用于读取Excel模板中的数据到指定的Java对象中,`Finish`方法用于关闭ExcelReader对象。
easyexcel dataconvert的用法
easyexcel dataconvert的用法EasyExcel是一款基于Java的开源Excel处理工具,它提供了丰富的API,使得Excel文件的读取、写入和转换变得简单高效。
其中,dataconvert 是EasyExcel中的一个重要功能模块,用于数据转换及批量写入Excel文件。
本篇文章将介绍dataconvert的用法,从安装到具体实例操作,逐步详细解答,希望能够对读者有所帮助。
第一步:安装与引入EasyExcel库要使用dataconvert功能,首先需要下载并安装EasyExcel库。
可以通过在Maven项目中添加依赖项来引入EasyExcel库,以下是常用的Maven 依赖:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.3.0</version></dependency>在引入库后,就可以开始使用EasyExcel中的dataconvert功能了。
第二步:创建Excel文件的读取类dataconvert是用于将数据转换为Excel文件格式的功能模块。
首先,我们需要创建一个Excel文件的读取类,用于读取Excel中的数据。
以下是读取Excel文件的示例代码:javapublic class ExcelReader {public static void main(String[] args) {String fileName = "path/to/excel/file.xlsx";EasyExcel.read(fileName, DataModel.class, new ExcelDataListener()).sheet().doRead();}}上述代码中,需要提供Excel文件的路径及文件名,然后使用EasyExcel 的read方法读取Excel数据。
通过Excel批量导入数据-Java代码
通过Excel批量导⼊数据-Java代码1. 依赖<!-- excel导出 start--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency><!-- excel导出 end-->2. 导⼊⼯具类/*** 将 Excel内容转为List** @param file 上传的Excel⽂件* @param name Excel表格中第⼀个sheet的名字* @return对应的map集合**/public static List<Map<String, Object>> excelToList(MultipartFile file, String name) throws Exception {Workbook workbook = WorkbookFactory.create(file.getInputStream());Sheet sheet = workbook.getSheet(name);//⾏数int num = sheet.getLastRowNum();//列数int col = sheet.getRow(0).getLastCellNum();List<Map<String, Object>> list = new ArrayList<>();String[] colName = new String[col];//获取列名Row row = sheet.getRow(0);for (int i = 0; i < col; i++) {String[] s = row.getCell(i).getStringCellValue().split("-");colName[i] = s[0];}//将⼀⾏中每列数据放⼊⼀个map中,然后把map放⼊listfor (int i = 1; i <= num; i++) {Map<String, Object> map = new HashMap<>();Row row1 = sheet.getRow(i);if (row1 != null) {for (int j = 0; j < col; j++) {Cell cell = row1.getCell(j);if (cell != null) {cell.setCellType(Cell.CELL_TYPE_STRING);map.put(colName[j], cell.getStringCellValue());}}}list.add(map);}return list;}3. 导⼊业务代码public void importExcel(MultipartFile file) {try {List<Map<String, Object>> importList = ExcelUtil.excelToList(file, "Sheet1");List<User> list = getUserList(importList);int flag = 0;List<User> userList = new ArrayList<>(16);for (User u : list) {userList.add(h);flag++;if (0 == flag % 500 || flag == list.size()) {UserDao.addBatchUser(userList);userList.clear();("执⾏前 {} 条成功", flag);}}} catch (Exception e) {("导⼊Excel失败");e.printStackTrace();}}private List<User> getUserList(List<Map<String, Object>> importList) {List<User> list = new ArrayList<>(16);importList.forEach(e -> {User user = new User();if (Objects.nonNull(e.get("姓名"))) {user.setUsername(e.get("姓名").toString());}if (Objects.nonNull(e.get("年龄"))) {user.setAge(e.get("年龄").toString());}if (Objects.nonNull(e.get("⼿机号"))) {user.setPhone(e.get("⼿机号").toString());}list.add(user);});return list;}========================================================================================== 1. 导出Excel⼯具类/*** 导出 excel** @param response 响应下载* @param name ⽂件名字* @param list 导出的数据list* @return**/public static void exportToExcel(HttpServletResponse response, String name, List<LinkedHashMap<String, Object>> list) {try {//⽂件名称String fileName = name + ".xls";HSSFWorkbook hssfWorkbook = new HSSFWorkbook();HSSFSheet hssfSheet = hssfWorkbook.createSheet(name);int rowNum = 0;//新建⾏HSSFRow hssfRow = hssfSheet.createRow(rowNum++);//列int j = 0;if (list.size() > 0) {for (String i : list.get(0).keySet()) {//新建第⼀⾏hssfRow.createCell(j++).setCellValue(i);}//将数据放⼊表中for (int i = 0; i < list.size(); i++) {//新建⼀⾏HSSFRow row = hssfSheet.createRow(rowNum++);Map map = list.get(i);System.out.println(map);j = 0;for (Object obj : map.values()) {if (obj != null) {row.createCell(j++).setCellValue(obj.toString());} else {row.createCell(j++);}}}}// 告诉浏览器⽤什么软件可以打开此⽂件response.setHeader("content-Type", "application/vnd.ms-excel");// 下载⽂件的默认名称response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));hssfWorkbook.write(response.getOutputStream());} catch (Exception e) {e.printStackTrace();}}2. 导出业务代码public void exportExcel(HttpServletResponse response, String name) {List<LinkedHashMap<String, Object>> list = new ArrayList<>(16);UserDto userDto = new UserDto(18);//设置导出哪些数据List<User> userList = userDao.selectByCon(userDto);userList.forEach(e->{ LinkedHashMap<String, Object> map = new LinkedHashMap<>(16);map.put("姓名",e.getUsername());map.put("年龄",e.getAge());map.put("⼿机号",e.getPhone());list.add(map);});ExcelUtil.exportToExcel(response,name,list);}3. 可以在浏览器访问接⼝,直接下载,也可以调⽤postman->send and download请求下载。
java批量导出excel格式数据(含每条数据的附件)
,批量导出数据到excel中(包含每条数据对应的附件)本程序功能功能说明采用压缩的方法把用户要导出的excel 文件和excle数据中每条数据对应的文件,打包成一个大文件,输出到缓存区,用户通过浏览器来下载这个文件,缺陷是文件过大时,比如几个G大小的附件,ie下载很慢。
建议用360等支持断点续传的功能的浏览器来下载。
Excel查看附件采用的是链接方式详细如下面截图,点击文件链接,可以链接到相对文件位置的文件夹(因为附件可能是多个,采用的都是文件夹的相对链接的方式实现的),压缩包内存放的文件结构:Excel文件,reportfile(存放附件的文件夹,文件夹结构详细见代码)每行excel 都对应相对的文件夹(reportfile内的某一个子文件夹和excel的行号相对应),如下截图,红色圈圈链接的就是对应的相应文件夹下的appfile文件夹下的文件://引入的类import org.apache.tools.zip.ZipEntry;//把文件写入到压缩对象outimport org.apache.tools.zip.ZipOutputStream;import java.io.*;import java.io.OutputStream;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFFont;import ermodel.HSSFRichTextString;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFCellUtil;import org.apache.poi.hssf.util.HSSFColor;import org.apache.poi.hssf.util.Region;import ermodel.Font;import ermodel.HSSFHyperlink;//写入压缩的文件对象privatevoid zipfileinfo(ZipOutputStream out, File f, String base) throws Exception{//记录文件“f”对象在压缩包中的位置及压缩后的文件名称:out.putNextEntry(new ZipEntry(base));、// 写入压缩文件对象FileInputStream in = new FileInputStream(f);int b = 0;byte[] buf = newbyte[1024];while ((b = in.read(buf)) != -1){out.write(buf, 0, b);}in.close();}// 开始压缩文件privatevoid ziptmpfilelist(ZipOutputStream out, String factfielnamelist,String tmpfielnamelist) throws Exception {String[] tmpList = tmpfielnamelist.split(";");String[] fackList = factfielnamelist.split(";");for (int i = 0; i<tmpList.length; i++) {File tmpfile = new File(fackList[i]);zipfileinfo(out, tmpfile, tmpList[i].replaceAll("\\\\", "/"));}}@Overrideprotectedvoid doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 存放文件的实际位置位置(绝对路径)String factfielnamelist="D:\\iscm\\attachdata\\2015\\0422\\FuaiFugQArVTjpG;D:\\iscm\\a ttachdata\\2015\\0422\\HIxtANutsZrwDTZ;D:\\iscm\\attachdata\\2 015\\0422\\HIxtANutsZrwDTZ";// 存放文件的位置(绝对路径)压缩时对应文件在压缩文件中的位置及名称String tmpfielnamelist = "reportfile\\tmp1\\appfile\\项目审批2.ipa;reportfile\\tmp1\\appfile\\项目审批1.doc;reportfile\\tmp1\\selffile\\app.docx";try {// 存放临时文件的目录(绝对路径)ZipOutputStream out = new ZipOutputStream(new FileOutputStream("d:\\test.zip"));response.reset();response.setContentType("application/octet-stream");response.setHeader("Content-Disposition","attachment;filename=test.zip");// 输出到缓存区方式ZipOutputStream out = newZipOutputStream(response.getOutputStream());// out.setEncoding("gbk");out.setEncoding("gb2312");//System.out.println(zipFileName);ziptmpfilelist(out, factfielnamelist, tmpfielnamelist);//输出到excel中 List<LinkedHashMap<String, Object>> result 是excel 写入的数据集合,这个需要自己重新定义.ExportExcelUtils.exportExcelAppReoort("App报备信息", headers, columns,result, "", out);out.close();} catch (Exception e) {e.printStackTrace();}}创建excel对象并写入压缩包方法/*** 控制点导出Excel的方法* @param title excel中的sheet名称* @param headers 表头* @param columns 表头对应的数据库中的列名* @param result 结果集* @param out 输出流* @param pattern 时间格式* @throws Exception*/publicstaticvoid exportExcelAppReoort(String title, String[] headers, String[] columns, List<LinkedHashMap<String, Object>> result, String filepath, ZipOutputStream out) throws Exception{//java.io.FileOutputStream out=newjava.io.FileOutputStream(filepath);// 声明一个工作薄HSSFWorkbook workbook = new HSSFWorkbook();// 生成一个表格HSSFSheet sheet = workbook.createSheet(title);// 设置表格默认列宽度为20个字节sheet.setDefaultColumnWidth(20);// 生成一个样式HSSFCellStyle style = workbook.createCellStyle();// 设置这些样式style.setFillForegroundColor(HSSFColor.GOLD.index);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 生成一个字体HSSFFont font = workbook.createFont();font.setColor(HSSFColor.VIOLET.index);//font.setFontHeightInPoints((short) 12);font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 把字体应用到当前的样式style.setFont(font);// 指定当单元格内容显示不下时自动换行style.setWrapText(true);// 产生表格标题行HSSFRow row1 = sheet.createRow(0);// sheet.addMergedRegion(new CellRangeAddress(1,2,3,4));//合并单元格sheet.addMergedRegion(new Region(0,(short)0,0,(short)19));row1.setHeight((short)600); //设置行高度HSSFCell cell1 = row1.createCell(0);cell1.setCellStyle(style);cell1.setCellValue(title); //"App报备信息"HSSFRow row = sheet.createRow(1);for (int i = 0; i<headers.length; i++) {HSSFCell cell = row.createCell(i);cell.setCellStyle(style);HSSFRichTextString text = new HSSFRichTextString(headers[i]); cell.setCellValue(text);}// 遍历集合数据,产生数据行if(result != null){int index = 2;for(LinkedHashMap<String, Object> m:result){row = sheet.createRow(index);int cellIndex = 0;for(String s:columns){HSSFCell cell = row.createCell(cellIndex);//cell.setCellStyle(style2);HSSFRichTextStringrichString = new HSSFRichTextString(m.get(s) == null ? "" : m.get(s).toString());if(s.equals("appAttr") || s.equals("threeSynAttr") ){//当前记录记录附件链接的文件夹位置(文件可能多个,如果一个的话,可以自己处理直接链接指向文件)String tmp=richString.toString();if (!(richString.toString().equals(""))){cell.setCellValue("文件链接");HSSFHyperlink link =new HSSFHyperlink(HSSFHyperlink.LINK_URL);link.setAddress(richString.toString());cell.setHyperlink(link);}}else{if(cellIndex==0)cell.setCellValue(Integer.valueOf(m.get(s).toString()));elsecell.setCellValue(richString);}cellIndex++;}index++;}}//写入压缩包out.putNextEntry(new ZipEntry("appReport.xls"));workbook.write(out); //写入文件}。
Java导入excel并保存到数据库
Java导⼊excel并保存到数据库⾸先建⽴好excel表格,并对应excel表格创建数据库表。
前台jsp页⾯:其中包含js<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>导⼊excel</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="导⼊excel"><script type="text/javascript" src="view/js/jquery-1.8.2.js"></script></head><script type="text/javascript">var User = function() {this.init = function() {//模拟上传excel$("#uploadEventBtn").unbind("click").bind("click", function() {$("#uploadEventFile").click();});$("#uploadEventFile").bind("change", function() {$("#uploadEventPath").attr("value", $("#uploadEventFile").val());});};//点击上传钮this.uploadBtn = function() {var uploadEventFile = $("#uploadEventFile").val();if (uploadEventFile == '') {alert("请择excel,再上传");} else if (stIndexOf(".xls") < 0) {//可判断以.xls和.xlsx结尾的excelalert("只能上传Excel⽂件");} else {var url = "excel/import.do";var formData = new FormData($('form')[0]);user.sendAjaxRequest(url, "POST", formData);}};this.sendAjaxRequest = function(url, type, data) {$.ajax({url : url,type : type,data : data,dataType : "json",success : function(result) {alert(result.message);},error : function(result) {alert(result.message);},cache : false,contentType : false,processData : false});};};var user;$(function() {user = new User();user.init();});</script><body><form enctype="multipart/form-data" id="batchUpload" action="/excel/import" method="post" class="form-horizontal"><button class="btn btn-success btn-xs" id="uploadEventBtn" style="height:26px;" type="button">择⽂件</button><input type="file" name="file" style="width:0px;height:0px;" id="uploadEventFile"><input id="uploadEventPath" disabled="disabled" type="text" placeholder="请择excel表" style="border: 1px solid #e6e6e6; height: 26px;width: 200px;"/> </form><button type="button" class="btn btn-success btn-sm" onclick="user.uploadBtn()">上传</button></body></html>后台代码:Controller1import java.util.HashMap;2import java.util.Map;5import javax.servlet.http.HttpServletResponse;67import org.springframework.beans.factory.annotation.Autowired;8import org.springframework.stereotype.Controller;9import org.springframework.web.bind.annotation.RequestMapping;10import org.springframework.web.bind.annotation.RequestMethod;11import org.springframework.web.bind.annotation.RequestParam;12import org.springframework.web.bind.annotation.ResponseBody;13import org.springframework.web.multipart.MultipartFile;1415import service.ImportService;1617 @Controller18 @RequestMapping("/excel")19public class ImportExcelController{20 @Autowired(required=true)21private ImportService importService;2223//导⼊excel24 @RequestMapping(value = "/import", method=RequestMethod.POST)25 @ResponseBody26public Map<String, Object> importExcel(@RequestParam(value="file",required = false) MultipartFile file, HttpServletRequest request,HttpServletResponse response){27 Map<String, Object> map = new HashMap<String, Object>();28 String result = importService.readExcelFile(file);29 map.put("message", result);30return map;31 }3233 }service:1import org.springframework.web.multipart.MultipartFile;23public interface ImportService {45/**6 * 读取excel中的数据,⽣成list7*/8 String readExcelFile(MultipartFile file);910 }serviceImpl:1import java.util.List;2import java.util.Map;34import org.springframework.beans.factory.annotation.Autowired;5import org.springframework.stereotype.Service;6import org.springframework.web.multipart.MultipartFile;78import service.ImportService;9import controller.ReadExcel;10import erDao;1112 @Service13public class ImportServiceImpl implements ImportService {14 @Autowired(required = true)15private UserDao userDao;16 @Override17public String readExcelFile(MultipartFile file) {18 String result = "";19//创建处理EXCEL的类20 ReadExcel readExcel = new ReadExcel();21//解析excel,获取上传的事件单22 List<Map<String, Object>> userList = readExcel.getExcelInfo(file);23//⾄此已经将excel中的数据转换到list⾥⾯了,接下来就可以操作list,可以进⾏保存到数据库,或者其他操作,24for(Map<String, Object> user:userList){25int ret = userDao.insertUser(user.get("name").toString(), user.get("sex").toString(), Integer.parseInt(user.get("age").toString()));26if(ret == 0){27 result = "插⼊数据库失败";28 }29 }30if(userList != null && !userList.isEmpty()){31 result = "上传成功";32 }else{33 result = "上传失败";34 }35return result;36 }3738 }dao:public interface UserDao {public int insertUser(String name, String sex, int age);}daoImpl:2import org.springframework.dao.DataAccessException;3import org.springframework.jdbc.core.JdbcTemplate;4import ponent;56import erDao;78 @Component9public class UserDaoImpl implements UserDao {10 @Autowired(required = true)11private JdbcTemplate jdbcTemplate;1213 @Override14public int insertUser(String name, String sex, int age) {15 String sql = "insert into user(name,sex,age) values('"+ name +"','"+ sex +"',"+age+")"; 16int ret = 0;17try {18 ret = jdbcTemplate.update(sql);19 } catch (DataAccessException e) {20 e.printStackTrace();21 }22return ret;23 }2425 }ReadExcel:1package controller;23import java.io.IOException;4import java.io.InputStream;5import java.util.ArrayList;6import java.util.HashMap;7import java.util.List;8import java.util.Map;910import ermodel.HSSFCell;11import ermodel.HSSFWorkbook;12import ermodel.Cell;13import ermodel.Row;14import ermodel.Sheet;15import ermodel.Workbook;16import ermodel.XSSFWorkbook;17import org.springframework.web.multipart.MultipartFile;1819/**20 *21 * @author hewangtong22 *23*/24public class ReadExcel {25// 总⾏数26private int totalRows = 0;27// 总条数28private int totalCells = 0;29// 错误信息接收器30private String errorMsg;3132// 构造⽅法33public ReadExcel() {34 }3536// 获取总⾏数37public int getTotalRows() {38return totalRows;39 }4041// 获取总列数42public int getTotalCells() {43return totalCells;44 }4546// 获取错误信息47public String getErrorInfo() {48return errorMsg;49 }5051/**52 * 读EXCEL⽂件,获取信息集合53 *54 * @param fielName55 * @return56*/57public List<Map<String, Object>> getExcelInfo(MultipartFile mFile) {58 String fileName = mFile.getOriginalFilename();// 获取⽂件名59// List<Map<String, Object>> userList = new LinkedList<Map<String, Object>>();60try {61if (!validateExcel(fileName)) {// 验证⽂件名是否合格62return null;63 }64boolean isExcel2003 = true;// 根据⽂件名判断⽂件是2003版本还是2007版本65if (isExcel2007(fileName)) {66 isExcel2003 = false;68return createExcel(mFile.getInputStream(), isExcel2003);69 } catch (Exception e) {70 e.printStackTrace();71 }72return null;73 }7475/**76 * 根据excel⾥⾯的内容读取客户信息77 *78 * @param is 输⼊流79 * @param isExcel2003 excel是2003还是2007版本80 * @return81 * @throws IOException82*/83public List<Map<String, Object>> createExcel(InputStream is, boolean isExcel2003) {84try {85 Workbook wb = null;86if (isExcel2003) {// 当excel是2003时,创建excel200387 wb = new HSSFWorkbook(is);88 } else {// 当excel是2007时,创建excel200789 wb = new XSSFWorkbook(is);90 }91return readExcelValue(wb);// 读取Excel⾥⾯客户的信息92 } catch (IOException e) {93 e.printStackTrace();94 }95return null;96 }9798/**99 * 读取Excel⾥⾯客户的信息100 *101 * @param wb102 * @return103*/104private List<Map<String, Object>> readExcelValue(Workbook wb) {105// 得到第⼀个shell106 Sheet sheet = wb.getSheetAt(0);107// 得到Excel的⾏数108this.totalRows = sheet.getPhysicalNumberOfRows();109// 得到Excel的列数(前提是有⾏数)110if (totalRows > 1 && sheet.getRow(0) != null) {111this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();112 }113 List<Map<String, Object>> userList = new ArrayList<Map<String, Object>>();114// 循环Excel⾏数115for (int r = 1; r < totalRows; r++) {116 Row row = sheet.getRow(r);117if (row == null) {118continue;119 }120// 循环Excel的列121 Map<String, Object> map = new HashMap<String, Object>();122for (int c = 0; c < this.totalCells; c++) {123 Cell cell = row.getCell(c);124if (null != cell) {125if (c == 0) {126// 如果是纯数字,⽐如你写的是25,cell.getNumericCellValue()获得是25.0,通过截取字符串去掉.0获得25 127if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {128 String name = String.valueOf(cell.getNumericCellValue());129 map.put("name", name.substring(0, name.length() - 2 > 0 ? name.length() - 2 : 1));// 名称130 } else {131 map.put("name", cell.getStringCellValue());// 名称132 }133 } else if (c == 1) {134if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {135 String sex = String.valueOf(cell.getNumericCellValue());136 map.put("sex",sex.substring(0, sex.length() - 2 > 0 ? sex.length() - 2 : 1));// 性别137 } else {138 map.put("sex",cell.getStringCellValue());// 性别139 }140 } else if (c == 2) {141if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {142 String age = String.valueOf(cell.getNumericCellValue());143 map.put("age", age.substring(0, age.length() - 2 > 0 ? age.length() - 2 : 1));// 年龄144 } else {145 map.put("age", cell.getStringCellValue());// 年龄146 }147 }148 }149 }150// 添加到list151 userList.add(map);152 }153return userList;154 }155156/**157 * 验证EXCEL⽂件158 *159 * @param filePath160 * @return162public boolean validateExcel(String filePath) {163if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) { 164 errorMsg = "⽂件名不是excel格式";165return false;166 }167return true;168 }169170// @描述:是否是2003的excel,返回true是2003171public static boolean isExcel2003(String filePath) {172return filePath.matches("^.+\\.(?i)(xls)$");173 }174175// @描述:是否是2007的excel,返回true是2007176public static boolean isExcel2007(String filePath) {177return filePath.matches("^.+\\.(?i)(xlsx)$");178 }179180 }。
记一次Java导出大批量Excel优化
记⼀次Java导出⼤批量Excel优化常⽤的excel导出⽅案,详情见,其中jxl、esayEscel 底层都是基于 poi,它们仅仅是对 poi 进⾏了封装,使导出 excel 的代码更加简洁(封装poi,导出 excel 的⼯具类有很多,jxl 和 esayExcel 使⽤的⽐较多)。
所以,如果遇到 excel 导出效率低下,直接基于 poi 导出 Excel,效率肯定是最⾼的,只是代码⽐较繁琐与杂乱。
我主要是基于 esayExcel (⽬前使⽤⽐较多),对其 api 进⾏衍⽣与应⽤,解决导出⼤量 Excel 导致的 OOM,或者数据超界异常:ng.IllegalArgumentException: Invalid row number (1048576) outside allowable range (0..1048575)应⽤是基于100W条数据进⾏的测试,数据的获取代码如下1package bean;23import com.alibaba.excel.annotation.ExcelProperty;4import com.alibaba.excel.annotation.format.DateTimeFormat;5import com.alibaba.excel.annotation.format.NumberFormat;6import lombok.Data;7import lombok.experimental.Accessors;89import java.util.Date;1011/**12 * @author dz13 * @date 2021-11-06 上午 9:1414*/15 @Accessors(chain = true)16 @Data17public class ExcelBean {1819 @ExcelProperty("主键id")20private String id;2122 @ExcelProperty("姓名")23private String name;2425 @ExcelProperty("地址")26private String address;2728 @ExcelProperty("年龄")29private Integer age;3031 @ExcelProperty("数量")32private Integer number;3334 @NumberFormat("#.##")35 @ExcelProperty("⾝⾼")36private Double high;3738 @ExcelProperty("距离")39private Double distance;4041 @DateTimeFormat("yyyy-MM-dd HH:mm:ss")42 @ExcelProperty("开始时间")43private Date startTime;4445 @ExcelProperty("结束时间")46private Date endTime;47 }1/**2 * 获取excel 导出的数据3 *4 * @return list 集合5*/6private List<ExcelBean> getDate() {7 ("开始⽣成数据");8 Date date = new Date();9long startTime = System.currentTimeMillis();10 List<ExcelBean> list = Lists.newArrayList();11for (int i = 0; i < 1000000; i++) {12 ExcelBean bean = new ExcelBean();13 bean.setId(UUID.randomUUID().toString()).14 setName("隔壁⽼樊" + i).15 setAddress("北京市朝阳区酒仙桥" + i + "路").16 setAge(i).17 setNumber(i + 10000).18 setHigh(1.234 * i).19 setDistance(1.234 * i).20 setStartTime(date).21 setEndTime(date);22 list.add(bean);23 }24 ("数据⽣成结束,数据量={},耗时={}ms", list.size(), System.currentTimeMillis() - startTime);25return list;26 }pom 依赖1<dependency>2<groupId>org.projectlombok</groupId>3<artifactId>lombok</artifactId>4</dependency>5<dependency>6<groupId>com.alibaba</groupId>7<artifactId>easyexcel</artifactId>8<version>2.2.10</version>9</dependency>依赖 esayexcel 时,如果项⽬已经依赖了 poi,有可能会产⽣jar 包依赖冲突(easyexcel底层也是基于 poi),解决⽅案如下:⽅案⼀:查看 easyexcel 中依赖的 poi 的版本,然后将项⽬其余地⽅的版本修改成该版本,使项⽬依赖的 poi 版本和 easyexcel 依赖的版本⼀致⽅案⼆:在 esayexcel 中将 poi 的依赖排除掉,如下<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId></exclusion></exclusions></dependency>常量的定义1public static final String FILE_NAME = "D:\\test_" + System.currentTimeMillis() + ".xlsx";2// 每个 sheet 写⼊的数据3public static final int NUM_PER_SHEET = 300000;4// 每次向 sheet 中写⼊的数据(分页写⼊)5public static final int NUM_BY_TIMES = 50000;1.EasyExcel 导出 excel 应⽤使⽤ esayExcel ⾃带的 api 导出 excel 的应⽤,代码如下1/**2 * ⽅法⼀:将数据写⼊到excel3 * 直接调⽤api,适合⼩数据量4 * 100W条数据33s5*/6 @Test7public void writeExcelByApi() {8 String fileName = FILE_NAME;9 ("导出excel名称={}", fileName);10long startTime = System.currentTimeMillis();11// 直接调⽤api12 List<ExcelBean> date = getDate();13 EasyExcel.write(fileName, ExcelBean.class).sheet().doWrite(date);14 ("导出excel结束,数据量={},耗时={}ms", date.size(), System.currentTimeMillis() - startTime);15 }当 list 对象数据量太多,就会产⽣异常:原因是单个 excel ⼀个 sheet 的最⼤数据量为 10485751 ng.IllegalArgumentException: Invalid row number (1048576) outside allowable range (0..1048575)23 at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:123)4 at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:65)5 at com.alibaba.excel.util.WorkBookUtil.createRow(WorkBookUtil.java:70)6 at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addOneRowOfDataToExcel(ExcelWriteAddExecutor.java:67)7 at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.add(ExcelWriteAddExecutor.java:56)8 at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:58)9 at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:161)10 at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:146)11 at com.alibaba.excel.write.builder.ExcelWriterSheetBuilder.doWrite(ExcelWriterSheetBuilder.java:61)12 at mytest.TestExcel.writeExcelByApi(TestExcel.java:40)13 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)14 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)15 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)16 at ng.reflect.Method.invoke(Method.java:498)17 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)18 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)19 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)20 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)21 at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)22 at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)23 at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)24 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)25 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)26 at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)27 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)28 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)29 at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)30 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)31 at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)32 at org.junit.runners.ParentRunner.run(ParentRunner.java:413)33 at org.junit.runner.JUnitCore.run(JUnitCore.java:137)34 at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)35 at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)36 at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)37 at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)2.EasyExcel 导出 excel 应⽤优化⼀:execl 数据量超过1048575将数据写⼊到不同的 sheet,保证每个 sheet 的数据量⼩于 1048575 ⾏,解决此问题,代码如下1/**2 * ⽅法⼆:导出多个sheet3 * easyExcel 底层是 POI 实现的,POI 单个sheet 最多只能导出 1048576 ⾏,超过该⾏数,会产⽣如下异常4 * ng.IllegalArgumentException: Invalid row number (1048576) outside allowable range (0..1048575)5 * <p>6 * 11:57:55.541 [main] INFO mytest.TestExcel - 写⼊sheet=sheet0,数据量300000-0=300000,耗时=6055ms7 * 11:57:59.701 [main] INFO mytest.TestExcel - 写⼊sheet=sheet1,数据量600000-300000=300000,耗时=4159ms8 * 11:58:03.827 [main] INFO mytest.TestExcel - 写⼊sheet=sheet2,数据量900000-600000=300000,耗时=4126ms9 * 11:58:05.193 [main] INFO mytest.TestExcel - 写⼊sheet=sheet3,数据量1000000-900000=100000,耗时=1366ms10 * 11:58:17.418 [main] INFO mytest.TestExcel - 导出excel结束,总数据量=1000000,耗时=31297ms11*/12 @Test13public void writeExcelByMulSheet() {14 String fileName = FILE_NAME;15 ("导出excel名称={}", fileName);16long startTime = System.currentTimeMillis();17// 获取数据18 List<ExcelBean> date = getDate();19// 获取 sheet 的个数20int sheetNum = date.size() % NUM_PER_SHEET == 0 ? date.size() / NUM_PER_SHEET : date.size() / NUM_PER_SHEET + 1;21// 指定写⼊的⽂件22 ExcelWriter excelWriter = EasyExcel.write(fileName, ExcelBean.class).build();23for (int i = 0; i < sheetNum; i++) {24long l = System.currentTimeMillis();25// 设置 sheet 的名字(sheet不能相同)26 String sheetName = "sheet" + i;27 WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName).build();28int startNum = i * NUM_PER_SHEET;29int endNum = i == sheetNum - 1 ? date.size() : (i + 1) * NUM_PER_SHEET;30 excelWriter.write(date.subList(startNum, endNum), writeSheet);31 ("写⼊sheet={},数据量{}-{}={},耗时={}ms", sheetName, endNum, startNum, endNum - startNum, System.currentTimeMillis() - l);32 }33// 最好放在 finally中34 excelWriter.finish();35 ("导出excel结束,总数据量={},耗时={}ms", date.size(), System.currentTimeMillis() - startTime);36 }3.EasyExcel 导出 excel 应⽤优化⼆:数据源 list 太⼤,直接读取全部的 list 数据导致 OOM将 list 数据进⾏分页读取,并进⾏分页写⼊到 excel。
Java实现批量导入excel表格数据到数据库中的方法
Java实现批量导⼊excel表格数据到数据库中的⽅法本⽂实例讲述了Java实现批量导⼊excel表格数据到数据库中的⽅法。
分享给⼤家供⼤家参考,具体如下:1、创建导⼊抽象类package mon.excel;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.PrintStream;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener;import org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener;import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;import org.apache.poi.hssf.eventusermodel.HSSFListener;import org.apache.poi.hssf.eventusermodel.HSSFRequest;import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;import stCellOfRowDummyRecord;import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;import org.apache.poi.hssf.model.HSSFFormulaParser;import org.apache.poi.hssf.record.BOFRecord;import org.apache.poi.hssf.record.BlankRecord;import org.apache.poi.hssf.record.BoolErrRecord;import org.apache.poi.hssf.record.BoundSheetRecord;import org.apache.poi.hssf.record.FormulaRecord;import belRecord;import belSSTRecord;import org.apache.poi.hssf.record.NoteRecord;import org.apache.poi.hssf.record.NumberRecord;import org.apache.poi.hssf.record.RKRecord;import org.apache.poi.hssf.record.Record;import org.apache.poi.hssf.record.SSTRecord;import org.apache.poi.hssf.record.StringRecord;import ermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;/*** 导⼊抽象类* Created by charlin on 2017/9/7.*/public abstract class HxlsAbstract implements HSSFListener {private int minColumns;private POIFSFileSystem fs;private PrintStream output;private int lastRowNumber;private int lastColumnNumber;/** Should we output the formula, or the value it has? */private boolean outputFormulaValues = true;/** For parsing Formulas */private SheetRecordCollectingListener workbookBuildingListener;private HSSFWorkbook stubWorkbook;// Records we pick up as we processprivate SSTRecord sstRecord;private FormatTrackingHSSFListener formatListener;/** So we known which sheet we're on */private int sheetIndex = -1;private BoundSheetRecord[] orderedBSRs;@SuppressWarnings("unchecked")private ArrayList boundSheetRecords = new ArrayList();// For handling formulas with string resultsprivate int nextRow;private int nextColumn;private boolean outputNextStringRecord;private int curRow;private List<String> rowlist;@SuppressWarnings( "unused")private String sheetName;public HxlsAbstract(POIFSFileSystem fs)throws SQLException {this.fs = fs;this.output = System.out;this.minColumns = -1;this.curRow = 0;this.rowlist = new ArrayList<String>();}public HxlsAbstract(String filename) throws IOException,FileNotFoundException, SQLException {this(new POIFSFileSystem(new FileInputStream(filename)));}//excel记录⾏操作⽅法,以⾏索引和⾏元素列表为参数,对⼀⾏元素进⾏操作,元素为String类型// public abstract void optRows(int curRow, List<String> rowlist) throws SQLException ;//excel记录⾏操作⽅法,以sheet索引,⾏索引和⾏元素列表为参数,对sheet的⼀⾏元素进⾏操作,元素为String类型 public abstract void optRows(int sheetIndex,int curRow, List<String> rowlist) throws Exception;/*** 遍历 excel ⽂件*/public void process() throws IOException {MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);formatListener = new FormatTrackingHSSFListener(listener);HSSFEventFactory factory = new HSSFEventFactory();HSSFRequest request = new HSSFRequest();if (outputFormulaValues) {request.addListenerForAllRecords(formatListener);} else {workbookBuildingListener = new SheetRecordCollectingListener(formatListener);request.addListenerForAllRecords(workbookBuildingListener);}factory.processWorkbookEvents(request, fs);}/*** HSSFListener 监听⽅法,处理 Record*/@SuppressWarnings("unchecked")public void processRecord(Record record) {int thisRow = -1;int thisColumn = -1;String thisStr = null;String value = null;switch (record.getSid()) {case BoundSheetRecord.sid:boundSheetRecords.add(record);break;case BOFRecord.sid:BOFRecord br = (BOFRecord) record;//进⼊sheetif (br.getType() == BOFRecord.TYPE_WORKSHEET) {// Create sub workbook if requiredif (workbookBuildingListener != null && stubWorkbook == null) {stubWorkbook = workbookBuildingListener.getStubHSSFWorkbook();}// Works by ordering the BSRs by the location of// their BOFRecords, and then knowing that we// process BOFRecords in byte offset ordersheetIndex++;if (orderedBSRs == null) {orderedBSRs = BoundSheetRecord.orderByBofPosition(boundSheetRecords);}sheetName = orderedBSRs[sheetIndex].getSheetname();}break;case SSTRecord.sid:sstRecord = (SSTRecord) record;break;case BlankRecord.sid:BlankRecord brec = (BlankRecord) record;thisRow = brec.getRow();thisColumn = brec.getColumn();thisStr = "";break;case BoolErrRecord.sid:BoolErrRecord berec = (BoolErrRecord) record;thisRow = berec.getRow();thisColumn = berec.getColumn();thisStr = "";break;case FormulaRecord.sid:FormulaRecord frec = (FormulaRecord) record;thisRow = frec.getRow();thisColumn = frec.getColumn();if (outputFormulaValues) {if (Double.isNaN(frec.getValue())) {// Formula result is a string// This is stored in the next recordoutputNextStringRecord = true;nextRow = frec.getRow();nextColumn = frec.getColumn();} else {thisStr = formatListener.formatNumberDateCell(frec);}} else {thisStr = '"' + HSSFFormulaParser.toFormulaString(stubWorkbook, frec.getParsedExpression()) + '"';}break;case StringRecord.sid:if (outputNextStringRecord) {// String for formulaStringRecord srec = (StringRecord) record;thisStr = srec.getString();thisRow = nextRow;thisColumn = nextColumn;outputNextStringRecord = false;}break;case LabelRecord.sid:LabelRecord lrec = (LabelRecord) record;curRow = thisRow = lrec.getRow();thisColumn = lrec.getColumn();value = lrec.getValue().trim();value = value.equals("")?" ":value;this.rowlist.add(thisColumn, value);break;case LabelSSTRecord.sid:LabelSSTRecord lsrec = (LabelSSTRecord) record;curRow = thisRow = lsrec.getRow();thisColumn = lsrec.getColumn();if (sstRecord == null) {rowlist.add(thisColumn, " ");} else {value = sstRecord.getString(lsrec.getSSTIndex()).toString().trim();value = value.equals("")?" ":value;rowlist.add(thisColumn,value);}break;case NoteRecord.sid:NoteRecord nrec = (NoteRecord) record;thisRow = nrec.getRow();thisColumn = nrec.getColumn();// TODO: Find object to match nrec.getShapeId()thisStr = '"' + "(TODO)" + '"';break;case NumberRecord.sid:NumberRecord numrec = (NumberRecord) record;curRow = thisRow = numrec.getRow();thisColumn = numrec.getColumn();value = formatListener.formatNumberDateCell(numrec).trim();value = value.equals("")?" ":value;// Formatrowlist.add(thisColumn, value);break;case RKRecord.sid:RKRecord rkrec = (RKRecord) record;thisRow = rkrec.getRow();thisColumn = rkrec.getColumn();thisStr = '"' + "(TODO)" + '"';break;default:break;}// 遇到新⾏的操作if (thisRow != -1 && thisRow != lastRowNumber) {lastColumnNumber = -1;}// 空值的操作if (record instanceof MissingCellDummyRecord) {MissingCellDummyRecord mc = (MissingCellDummyRecord) record;curRow = thisRow = mc.getRow();thisColumn = mc.getColumn();rowlist.add(thisColumn," ");}// 如果遇到能打印的东西,在这⾥打印if (thisStr != null) {if (thisColumn > 0) {output.print(',');}output.print(thisStr);}// 更新⾏和列的值if (thisRow > -1)lastRowNumber = thisRow;if (thisColumn > -1)lastColumnNumber = thisColumn;// ⾏结束时的操作if (record instanceof LastCellOfRowDummyRecord) {if (minColumns > 0) {// 列值重新置空if (lastColumnNumber == -1) {lastColumnNumber = 0;}}// ⾏结束时,调⽤ optRows() ⽅法lastColumnNumber = -1;try {optRows(sheetIndex,curRow, rowlist);} catch (Exception e) {e.printStackTrace();}rowlist.clear();}}}2、创建导⼊接⼝package mon.excel;import java.util.List;public interface HxlsOptRowsInterface {public static final String SUCCESS="success";/*** 处理excel⽂件每⾏数据⽅法* @param sheetIndex* @param curRow* @param rowlist* @return success:成功,否则为失败原因* @throws Exception*/public String optRows(int sheetIndex, int curRow, List<String> rowlist) throws Exception; }3、创建实现类,在这个⽅法实现把导⼊的数据添加到数据库中package mon.excel;import java.util.List;public class HxlsInterfaceImpl implements HxlsOptRowsInterface {@Overridepublic String optRows(int sheetIndex, int curRow, List<String> datalist)throws Exception {//在这⾥执⾏数据的插⼊//System.out.println(rowlist);//saveData(datalist);return "";}}4、导⼊⼯具实现package mon.excel;import java.io.FileNotFoundException;import java.io.IOException;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;/*** excel导⼊⼯具* Created by charlin on 2017/9/7.*/public class ExcelImportUtil extends HxlsAbstract{//数据处理beanprivate HxlsOptRowsInterface hxlsOptRowsInterface;//处理数据总数private int optRows_sum = 0;//处理数据成功数量private int optRows_success = 0;//处理数据失败数量private int optRows_failure = 0;//excel表格每列标题private List<String> rowtitle ;//失败数据private List<List<String>> failrows;//失败原因private List<String> failmsgs ;//要处理数据所在的sheet索引,从0开始private int sheetIndex;public ExcelImportUtil(String filename, int sheetIndex, HxlsOptRowsInterface hxlsOptRowsInterface) throws IOException, FileNotFoundException, SQLException {super(filename);this.sheetIndex = sheetIndex;this.hxlsOptRowsInterface = hxlsOptRowsInterface;this.rowtitle = new ArrayList<String>();this.failrows = new ArrayList<List<String>>();this.failmsgs = new ArrayList<String>();}@Overridepublic void optRows(int sheetIndex,int curRow, List<String> rowlist) throws Exception {/*for (int i = 0 ;i< rowlist.size();i++){System.out.print("'"+rowlist.get(i)+"',");}System.out.println();*///将rowlist的长度补齐和标题⼀致int k=rowtitle.size()-rowlist.size();for(int i=0;i<k;i++){rowlist.add(null);}if(sheetIndex == this.sheetIndex){optRows_sum++;if(curRow == 0){//记录标题rowtitle.addAll(rowlist);}else{String result = hxlsOptRowsInterface.optRows(sheetIndex, curRow, rowlist);if(!result.equals(hxlsOptRowsInterface.SUCCESS)){optRows_failure++;//失败数据failrows.add(new ArrayList<String>(rowlist));failmsgs.add(result);}else{optRows_success++;}}}}public long getOptRows_sum() {return optRows_sum;}public void setOptRows_sum(int optRows_sum) {this.optRows_sum = optRows_sum;}public long getOptRows_success() {return optRows_success;}public void setOptRows_success(int optRows_success) {this.optRows_success = optRows_success;}public long getOptRows_failure() {return optRows_failure;}public void setOptRows_failure(int optRows_failure) {this.optRows_failure = optRows_failure;}public List<String> getRowtitle() {return rowtitle;}public List<List<String>> getFailrows() {return failrows;}public List<String> getFailmsgs() {return failmsgs;}public void setFailmsgs(List<String> failmsgs) {this.failmsgs = failmsgs;}}5、导⼊实现⽅法:public static void main(String[] args){ExcelImportUtil importUtil;try {importUtil = new ExcelImportUtil("d:/data.xls",0, new HxlsInterfaceImpl());importUtil.process();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}}更多关于java相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》及《》希望本⽂所述对⼤家java程序设计有所帮助。
java excel导入20万条
java excel导入20万条
在Java中导入20万条Excel数据可以通过以下几种方式来实现:
1. 使用Apache POI库,Apache POI是一个用于读写Microsoft Office文件的开源Java库。
你可以使用Apache POI来读取Excel文件并将数据导入到Java中。
你需要使用XSSFWorkbook和XSSFSheet类来读取Excel文件中的数据。
然后,你可以将读取到的数据存储在Java对象中,或者直接将数据插入到数据库中。
2. 使用JDBC连接Excel文件,你可以使用JDBC(Java Database Connectivity)来连接Excel文件,并通过Java代码将数据导入到数据库中。
首先,你需要使用ODBC(Open Database Connectivity)驱动程序来连接Excel文件,然后使用JDBC来执行插入操作。
3. 使用第三方库,除了Apache POI之外,还有一些其他的第三方库可以用来处理Excel文件,比如JExcelApi、JExcel等。
你可以选择适合你需求的库来实现数据导入操作。
无论你选择哪种方式,都需要注意以下几点:
内存管理,在导入大量数据时,需要注意内存的使用,避免内存溢出的问题。
优化性能,对于大量数据的导入,需要考虑性能优化,比如批量插入、使用索引等方式来提高导入速度。
异常处理,需要处理可能出现的异常情况,比如文件不存在、格式错误等。
总之,导入20万条Excel数据是一个比较大的任务,需要仔细考虑数据量、性能和异常处理等方面的问题,选择合适的方式来实现数据导入操作。
用Java在macOS电脑中进行数据的导入和导出
用Java在macOS电脑中进行数据的导入和导出在日常工作中,我们经常需要处理各种数据,包括导入和导出数据。
而对于使用macOS操作系统的开发人员来说,如何利用Java语言进行数据的导入和导出是一个常见的需求。
本文将介绍如何在macOS 电脑中使用Java编程语言进行数据的导入和导出操作。
1. 准备工作在开始之前,我们需要确保已经安装了Java开发环境(JDK)以及适当的集成开发环境(IDE),比如Eclipse或IntelliJ IDEA。
同时,我们还需要准备好要处理的数据文件,可以是Excel表格、CSV文件或其他格式的数据文件。
2. 数据导入2.1 从Excel表格导入数据在macOS电脑中使用Java导入Excel表格数据通常需要借助第三方库,比如Apache POI。
首先,在项目中引入Apache POI相关的依赖,然后编写代码读取Excel文件中的数据并进行处理。
示例代码star:编程语言:javaFileInputStream fis = new FileInputStream("data.xlsx");XSSFWorkbook workbook = new XSSFWorkbook(fis);XSSFSheet sheet = workbook.getSheetAt(0);// 读取数据for (Row row : sheet) {for (Cell cell : row) {// 处理单元格数据}}workbook.close();示例代码end2.2 从CSV文件导入数据如果要从CSV文件中导入数据,可以使用Java自带的CSV解析库OpenCSV。
首先引入OpenCSV相关的依赖,然后编写代码读取CSV文件中的数据。
示例代码star:编程语言:javaCSVReader reader = new CSVReader(newFileReader("data.csv"));String[] nextLine;while ((nextLine = reader.readNext()) != null) {// 处理每一行数据}reader.close();示例代码end3. 数据导出3.1 导出数据到Excel表格要将数据导出到Excel表格,同样可以使用Apache POI库。
java 使用jxl技术excel文件进行导入和导出实验用到的知识与技术
java 使用jxl技术excel文件进行导入和导出实验用到的知识与技术Java是一种流行的编程语言,而JXL技术是一种用于处理Excel文件的Java库。
在本文中,我们将一步一步地介绍如何使用JXL技术导入和导出Excel文件。
我们将从JXL技术的概述开始,然后讨论如何导入Excel文件,接着是如何导出Excel文件。
JXL技术是一个基于Java的开源库,用于读取、写入和操作Microsoft Excel文件。
它提供了一组API,可以方便地处理Excel文件中的单元格、行和列。
不仅可以读取现有的Excel文件,还可以创建新的Excel文件并在其中写入数据。
JXL技术支持Excel的各种版本,包括xls和xlsx格式。
接下来,我们将讨论如何导入Excel文件。
首先,我们需要在项目中引入JXL库的依赖。
在Maven项目中,我们可以将以下依赖添加到pom.xml 文件中:xml<dependency><groupId>net.sourceforge.jexcelapi</groupId><artifactId>jxl</artifactId><version>2.6.12</version></dependency>一旦我们引入了JXL依赖,我们就可以使用它的API来导入Excel文件。
首先,我们需要创建一个Workbook对象,它代表整个Excel文件。
我们可以使用Workbook类的静态方法getWorkbook()来打开一个现有的Excel文件,例如:javaWorkbook workbook = Workbook.getWorkbook(newFile("path/to/excel.xls"));在Workbook对象上,我们可以执行各种操作,例如获取特定的工作表、读取单元格的值等。
java后端导入excel模板和导入excel文件去读数据
java后端导⼊excel模板和导⼊excel⽂件去读数据模板转载地址:https:///zhangyangtao/p/9802948.html直接上代码(我是基于ssm写的demo,导⼊⽂件⽬前只能读取.xls后缀的excel⽂件)1<!--导⼊的核⼼依赖-->2<dependency>3<groupId>net.sourceforge.jexcelapi</groupId>4<artifactId>jxl</artifactId>5<version>2.6.12</version>6</dependency>1//这是下载模板的⽅法2 @RequestMapping("/downloadExcel.do")3 @ResponseBody4public void downloadExcel(HttpServletResponse res, HttpServletRequest req) throws Exception {5//⽂件的名称6 String fileName = "excelTemplate.xls";7 ServletOutputStream out;8 res.setContentType("multipart/form-data");9 res.setCharacterEncoding("UTF-8");10 res.setContentType("text/html");11//⽂件的路径 resource/template/1.xlsx12 String filePath = getClass().getResource("/template/" + fileName).getPath();13 System.out.println(filePath);14 String userAgent = req.getHeader("User-Agent");15if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {16 fileName = .URLEncoder.encode(fileName, "UTF-8");17 }else {18// ⾮IE浏览器的处理:19 fileName = new String((fileName).getBytes("UTF-8"), "ISO-8859-1");20 }21 filePath = URLDecoder.decode(filePath, "UTF-8");22 res.setHeader("Content-Disposition", "attachment;fileName=" + fileName);23 FileInputStream inputStream = new FileInputStream(filePath);24 out = res.getOutputStream();25int b = 0;26byte[] buffer = new byte[1024];27while ((b = inputStream.read(buffer)) != -1) {28// 4.写到输出流(out)中29 out.write(buffer, 0, b);30 }31 inputStream.close();32 out.flush();33 out.close();34// if (out != null) {35// out.flush();36// out.close();37//38// }3940 }41导⼊excel⽂件读取数据的⽅法1 @RequestMapping("/importExcel.do")2public void import2(String xlsPath) throws IOException, BiffException {34// 导⼊已存在的Excel⽂件,获得只读的⼯作薄对象5 FileInputStream fis = new FileInputStream(xlsPath);6 Workbook wk = Workbook.getWorkbook(fis);7// 获取第⼀张Sheet表8 Sheet sheet = wk.getSheet(0);9// 获取总⾏数10int rowNum = sheet.getRows();11 System.out.println("插⼊总⾏数:" + (rowNum-2));12// 从数据⾏开始迭代每⼀⾏13for (int i = 2; i < rowNum; i++) {14// 先判断插⼊的数据是否和数据库的数据重复15 System.out.println(sheet.getCell(0, i).getContents());16if (userService.findUser(sheet.getCell(0, i).getContents()) > 0) {17continue;18 }19 User u = new User();20// getCell(column,row),表⽰取得指定列指定⾏的单元格(Cell)21// getContents()获取单元格的内容,返回字符串数据。
springboot中使用java操作poi案例(excel数据写入与导出)
springboot中使⽤java操作poi案例(excel数据写⼊与导出)1.⼯程导⼊依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>RELEASE</version></dependency>这⾥导⼊两个poi的原因是:在excel的表格保存为xls和xlsx两种格式,excel表格早先是xls后来⼜加⼊了xlsx的格式,在下⾯的代码中会有所体现。
2.编写demo@RestController@RequestMapping("/POI")public class POIController {@RequestMapping("/createExcel")public void createExcel(){//HSSFWorkbook wb = new HSSFWorkbook();XSSFWorkbook wb = new XSSFWorkbook();XSSFSheet sheets= wb.createSheet("九九乘法表");for (int i=1;i<=9;i++){XSSFRow row = sheets.createRow(i - 1);for (int j = 1; j<= 9; j++) {XSSFCell cell = row.createCell(j - 1);cell.setCellValue(i+"*"+j+"="+i*j);}}try {FileOutputStream fileOutputStream = new FileOutputStream("d:\\test.xlsx");try {wb.write(fileOutputStream);} catch (IOException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();}}}⾥注意的点是在上图创建excel⼯作簿的时候有两种⽅式,如下所⽰:HSSFWorkbook wb = new HSSFWorkbook();//⽣成xls格式的excelXSSFWorkbook wb = new XSSFWorkbook();//⽣成xlsx格式的excel3.poi的整个设计是根据excel表格的特性来做的,⼤致思路是:3.1 通过HSSFWorkbook wb = new HSSFWorkbook()或 XSSFWorkbook wb = new XSSFWorkbook()⽣成excel⼯作簿(wb)3.2 通过创建好的⼯作簿去创建⼯作表(sheet)3.3 通过⼯作表去创建表中的⾏(row),⾏⾥索要填的内容就是单元格的内容(cell)最后,提供了⼯作簿(wb)、⼯作表(sheet)、表中的⾏(row)、⾏内容的单元格(cell)分别的api,⾃⼰稍微摸索⼀下就能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ReturnInfo info = new ReturnInfo();
InputStream is = null;
jxl.Workbook rwb = null;
try {
is = theForm.getImportAll().getInputStream();
bean.setVersionId(rs.getCell(9, i).getContents().trim());
bean.setIccid(rs.getCell(10, i).getContents().trim());
temp.add(bean);
}
bean.setCard_id(rs.getCell(0, i).getContents().trim());
bean.setCustType(rs.getCell(1, i).getContents().trim());
bean.setValid_date(rs.getCell(2, i).getContents().trim());
rwb = Workbook.getWorkbook(is);
int sheet = rwb.getNumberOfSheets();
for (int s = 0; s < sheet; s++) {
Sheet rs = rwb.getSheet(s);
rwb.getSheets();
bean.setStatus(rs.getCell(6, i).getຫໍສະໝຸດ ontents().trim());
bean.setCardAppStatus(rs.getCell(7, i).getContents().trim());
bean.setCardBrand(rs.getCell(8, i).getContents().trim());
bean.setCardAppStatus("0");
temp.add(bean);
}
}else if(cols == COL_OF_SHEET_2){
for (int i = 0; i < rows; i++) {
CardBean bean = new CardBean();
+ " 不符!目前列数是:" + COL_OF_SHEET+"或:"+ROW_OF_SHEET);
return info;
}
if(cols == COL_OF_SHEET){
for (int i = 0; i < rows; i++) {
CardBean bean = new CardBean();
bean.setBank_fee(rs.getCell(3, i).getContents().trim());
bean.setSubway_fee(rs.getCell(4, i).getContents().trim());
bean.setAppNo(rs.getCell(5, i).getContents().trim());
bean.setCard_id(rs.getCell(0, i).getContents().trim());
bean.setCustType(rs.getCell(1, i).getContents().trim());
bean.setValid_date(rs.getCell(2, i).getContents().trim());
}
}
} catch (Exception e) {
FileLog.errorLog(e);
info.setFlag(false);
info.setInfo("导入卡信息文件失败!");
return info;
}
info.setFlag(true);
continue;
if (rows > ROW_OF_SHEET) {
info.setFlag(false);
info.setInfo("第" + (s + 1) + "sheet中的行数:" + rows
+ " 超过最大行数限制:" + ROW_OF_SHEET);
public ReturnInfo importCardInfo(CardFormBean theForm, User user,
ArrayList temp) {
final int ROW_OF_SHEET = 50000; // 每个sheet中的最大行数
final int COL_OF_SHEET = 5; // 每个sheet中的列数
bean.setBank_fee(rs.getCell(3, i).getContents().trim());
bean.setSubway_fee(rs.getCell(4, i).getContents().trim());
bean.setStatus("0");
info.setInfo("导入卡信息文件成功!");
return info;
}
return info;
}
if (cols != COL_OF_SHEET && cols != COL_OF_SHEET_2) {
info.setFlag(false);
info.setInfo("第" + (s + 1) + "sheet中的列数:" + cols
int rows = rs.getRows();
int cols = rs.getColumns();
FileLog.debugLog("rows:" + rows);
FileLog.debugLog("cols:" + cols);
if (rows == 0)