Java实现Excel数据导入和导出的研究与应用
Java数据导入导出Excel

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;import jxl.Workbook;import jxl.format.UnderlineStyle;import bel;import jxl.write.WritableFont;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;import jxl.write.WriteException;import jxl.write.biff.RowsExceededException;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;public class ExcelOpt {/*** 生成一个Excel文件jxl* @param fileName 要生成的Excel文件名* @jxl.jar 版本:2.6*/public static void writeExcel(String fileName){WritableWorkbook wwb = null;try {//首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象wwb = Workbook.createWorkbook(new File(fileName));} catch (IOException e) {e.printStackTrace();}if(wwb!=null){//创建一个可写入的工作表//Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置WritableSheet ws = wwb.createSheet("工作表名称", 0);//下面开始添加单元格for(int i=0;i<10;i++){for(int j=0;j<5;j++){//这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行Label labelC = new Label(j, i, "这是第"+(i+1)+"行,第"+(j+1)+"列");try {//将生成的单元格添加到工作表中ws.addCell(labelC);} catch (RowsExceededException e) {e.printStackTrace();} catch (WriteException e) {e.printStackTrace();}}}try {//从内存中写入文件中wwb.write();//关闭资源,释放内存wwb.close();} catch (IOException e) {e.printStackTrace();} catch (WriteException e) {e.printStackTrace();}}}/*** 生成一个Excel文件POI* @param inputFile 输入模板文件路径* @param outputFile 输入文件存放于服务器路径* @param dataList 待导出数据* @throws Exception* @roseuid:*/public static void exportExcelFile(String inputFile,String outputFile,List dataList) throws Exception{//用模板文件构造poiPOIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(inputFile));//创建模板工作表HSSFWorkbook templatewb = new HSSFWorkbook(fs);//直接取模板第一个sheet对象HSSFSheet templateSheet = templatewb.getSheetAt(1);//得到模板的第一个sheet的第一行对象为了得到模板样式HSSFRow templateRow = templateSheet.getRow(0);//HSSFSheet timplateSheet = templatewb.getSheetAt(1);//取得Excel文件的总列数int columns = templateSheet.getRow((short) 0).getPhysicalNumberOfCells();// Debug.println("columns is : " + columns); //========================= //创建样式数组HSSFCellStyle styleArray[] = new HSSFCellStyle[columns];//一次性创建所有列的样式放在数组里for (int s = 0; s < columns; s++) {//得到数组实例styleArray[s] = templatewb.createCellStyle();} 循环对每一个单元格进行赋值//定位行for (int rowId = 1; rowId < dataList.size(); rowId++) {//依次取第rowId行数据每一个数据是valueListList valueList = (List) dataList.get(rowId - 1);//定位列for (int columnId = 0; columnId < columns; columnId++) {//依次取出对应与colunmId列的值//每一个单元格的值String dataValue = (String) valueList.get(columnId);//取出colunmId列的的style//模板每一列的样式HSSFCellStyle style = styleArray[columnId];//取模板第colunmId列的单元格对象//模板单元格对象HSSFCell templateCell = templateRow.getCell((short) columnId);//创建一个新的rowId行行对象//新建的行对象HSSFRow hssfRow = templateSheet.createRow(rowId);//创建新的rowId行columnId列单元格对象//新建的单元格对象HSSFCell cell = hssfRow.createCell((short) columnId);//如果对应的模板单元格样式为非锁定if (templateCell.getCellStyle().getLocked() == false) {//设置此列style为非锁定style.setLocked(false);//设置到新的单元格上cell.setCellStyle(style);}//否则样式为锁定else {//设置此列style为锁定style.setLocked(true);//设置到新单元格上cell.setCellStyle(style);}//设置编码cell.setEncoding(HSSFCell.ENCODING_UTF_16);//Debug.println("dataValue : " + dataV alue);//设置值统一为Stringcell.setCellValue(dataV alue);}}//设置输入流FileOutputStream fOut = new FileOutputStream(outputFile);//将模板的内容写到输出文件上templatewb.write(fOut);fOut.flush();//操作结束,关闭文件fOut.close();}/*** 导出数据为XLS格式* @param fos 生成Excel文件Path* @param bo 要导入的数据*/public static void writeExcelBo(String fos, java.util.List ve) {jxl.write.WritableWorkbook wwb;try{wwb= Workbook.createWorkbook(new File(fos));jxl.write.WritableSheet ws= wwb.createSheet("上市新书", 10);ws.addCell(new bel(0, 1, "书名"));ws.addCell(new bel(1, 1, "作者"));ws.addCell(new bel(2, 1, "定价"));ws.addCell(new bel(3, 1, "出版社"));int bookSize=ve.size();BookVO book = new BookVO();for (int i= 0; i < bookSize; i++){book= (BookVO)ve.get(i);ws.addCell(new bel(0, i + 2, "" + book.getBookName()));ws.addCell(new bel(1, i + 2, book.getBookAuthor()));ws.addCell(new bel(2, i + 2, "" + book.getBookPrice()));ws.addCell(new bel(3, i + 2, book.getBookConcern()));}// jxl.write.WritableFont wfc=//newjxl.write.WritableFont(WritableFont.ARIAL,255,WritableFont.BOLD,false,UnderlineStyle.NO_U NDERLINE,jxl.format.Colour.BLACK);//jxl.write.WritableCellFormat wcfFC= new jxl.write.WritableCellFormat(wfc);ws.addCell(new bel(0, 0, "2007年07月即将上市新书!"));wwb.write();// 关闭Excel工作薄对象wwb.close();} catch (IOException e){} catch (RowsExceededException e){} catch (WriteException e){}}public static void main(String[] args) {writeExcel("c:\\Test测试Excel.xls");System.out.println("OK");ArrayList list = new ArrayList();for (int i = 0; i < 10; i++) {BookVO book = new BookVO();book.setBookName("WebWork in action+"+i);book.setBookAuthor("唐勇+"+i);book.setBookPrice("39元+"+i);book.setBookConcern("飞思科技+"+i);list.add(book);}writeExcelBo("c:\\上市新书.xls",list);System.err.println("Book OK!!!");}}=================摘要=====================java如何操作Excel(数据导入导出)(转)jxl.jar,可以到下载。
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完整例子+完整代码,使用easypoi导出Excel+通用工具类

Java导出Excel完整例子+完整代码,使用easypoi导出Excel+通用工具类前言:在之前写Excel导入导出功能的时候,使用更多的可能是apache 的poi,相信用过poi的应该都会感觉poi使用起来还是有点点麻烦的,所以,如果你是:不太熟悉poi的、不想写太多重复太多的、只是简单的导入导出的。
那么相信我,使用easypoi绝对很适合。
easypoi,正如同它的名字一样,主打的功能就是容易,让一个没见接触过poi的人员,就可以很方便的写出Excel导出、Excel导入,通过简单的注解就可以完成以前复杂的写法。
so,今天就用easypoi来做一个导出Excel的完整案例,项目是SpringBoot的项目一、引入pom依赖<!-- excle导入导出依赖包 start --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.2.0</version></dependency><de pendency><groupId>cn.afterturn</groupId><artifactId>easyp oi-web</artifactId><version>3.2.0</version></dependency><de pendency><groupId>cn.afterturn</groupId><artifactId>easyp oi-annotation</artifactId><version>3.2.0</version></dependenc y><!-- excle导入导出依赖包 end -->注意:有的文章或者博客可能说可以不用上边三个依赖这么麻烦,直接用 easypoi-spring-boot-starter 一个依赖就可以了但是,用easypoi-spring-boot-starter 这个可能会导致你的springboot项目jar包依赖冲突,所以还是推荐使用上边的三个依赖二、定义需要导出的实体对象Userimport cn.afterturn.easypoi.excel.annotation.Excel;import cn .afterturn.easypoi.excel.annotation.ExcelTarget;import lombok.D ata;import java.io.Serializable;import java.util.Date;/*** 导出对应的实体类** @author caoju*/@ExcelTarget("user")@Datapublic class User implements Serializable {@Excel(name = "id",width=7)private In teger id;@Excel(name = "姓名",width=15)private String name;@Excel(name = "性别",replace = { "男_1", "女_2" },width=10)private Integer sex;@Excel(name = "创建时间",exportFormat = "yyyy-MM-dd HH:mm:ss",width=25)private Date createTime;}三、Excel导出工具类和导出自定义样式类不要看下面的两个类这么长,好像多复杂似的别担心!就是个工具类而已啦~你懂的,直接ctrl c、ctrl v(我也懂的,热爱编程的你,最喜欢的就是这个 c v大法,简单粗暴,不多bibi!hia hia hia~~~)import cn.afterturn.easypoi.excel.ExcelExportUtil;import cn. afterturn.easypoi.excel.entity.ExportParams;import cn.afterturn.e asypoi.excel.entity.TemplateExportParams;import cn.afterturn.ea sypoi.excel.entity.enmus.ExcelType;import com.xiaoleilu.hutool.d ate.DateUtil;import com.xiaoleilu.hutool.util.StrUtil;import lomb ok.extern.slf4j.Slf4j;import ermodel.Workbo ok;import javax.servlet.http.HttpServletResponse;import java.io.I OException;import java.io.OutputStream;import .URLEnc oder;import java.util.ArrayList;import java.util.List;import java.uti l.Map;/*** Excel导出工具类** @author caoju*/@Slf4jpublic class ExcelUtils {/** 允许导出的最大条数 */private static final Integer EXPORT_EXCEL_MAX_NUM = 10000;/*** 导出Excel** @param workbook workbook流* @param fileName 文件名* @param response 响应*/public static void exportExcel(Workbook workbook, String file Name, HttpServletResponse response) {//给文件名拼接上日期fileName = fileName + StrUtil.UNDERLINE + DateUtil.today();//输出文件try (OutputStream out = response.getOutputStream()) {//获取文件名并转码String name = URLEncoder.encode(fileName, "UTF-8");//设置编码response.setCharacterEncoding("UTF-8");//设置http响应头告诉浏览器,以下载的形式处理响应的数据response.setContentType("application/force-download");//设置下载文件的默认名称response.setHeader("Content-Disposition", "attachment;filename=" + name + ".xlsx");//输出表格workbook.write(out);} catch (IOException e) {log.error("文件导出异常,详情如下:", e);} finally {try {if (workbook != null) {//关闭输出流workbook.close();}} catch (IOException e) {log.error("文件导出异常,详情如下:", e);}}}/*** 获取导出的 Workbook对象** @param title 大标题* @param sheetName 页签名* @param object 导出实体* @param list 数据集合* @return Workbook*/public static Workbook getWorkbook(Stri ng title, String sheetName, Class object, List list) {//判断导出数据是否为空if (list == null) {list = new ArrayList<>();}//判断导出数据数量是否超过限定值if (list.size() > EXPORT_EXCEL_MAX_NUM) {title = "导出数据行数超过:" + EXPORT_EXCEL_MAX_NUM + "条,无法导出、请添加查询条件后再进行导出!";list = new ArrayList<>();}//导出参数ExportParams exportParams = new ExportParams(title, sheetNa me, ExcelType.XSSF);//设置导出样式,可以不设置使用默认的样式,这里用的是自定义样式exportParams.setStyle(ExcelStyle.class);//输出Workbook流return ExcelExportUtil.exportExcel(exportParams, object, list);}/** * 获取导出的 Workbook对象** @param path 模板路径* @param map 导出内容map* @return Workbook*/public static Workbook getWorkboo k(String path, Map<String, Object> map) {//获取导出模板TemplateExportParams params = new TemplateExportParams(p ath);//设置导出样式params.setStyle(ExcelStyle.class);//输出Workbook流return ExcelExportUtil.exportExcel(params, map);}} import cn.afterturn.easypoi.excel.entity.params.ExcelExportE ntity;import cn.afterturn.easypoi.excel.entity.params.ExcelForEac hParams;import cn.afterturn.easypoi.excel.export.styler.ExcelExp ortStylerDefaultImpl;import cn.afterturn.easypoi.excel.export.sty ler.IExcelExportStyler;import ermodel.*;/*** Excel导出自定义样式类** @author caoju*/public class ExcelStyle extends ExcelExportSt ylerDefaultImpl implements IExcelExportStyler {private static fin al short STRING_FORMAT = (short) BuiltinFormats.getBuiltinFor mat("TEXT");private static final short FONT_SIZE_TEN = 10;privat e static final short FONT_SIZE_ELEVEN = 11;private static final sh ort FONT_SIZE_TWELVE = 12;/*** 大标题样式*/private CellStyle headerStyle;/*** 每列标题样式*/private CellStyle titleStyle;/*** 数据行样式*/private CellStyle styles;public ExcelStyle(Workbook workbook) {super(workbook);this.init(workbook);}/*** 初始化样式** @param workbook*/private void init(Workbook workbook) {/ /大标题样式this.headerStyle = initHeaderStyle(workbook);//每列标题样式this.titleStyle = initTitleStyle(workbook);//数据行样式this.styles = initStyles(workbook);}/*** 大标题样式** @param color* @return*/@Overridepublic CellStyle getHead erStyle(short color) {return headerStyle;}/*** 每列标题样式** @param color* @return*/@Overridepublic CellStyle getTitleS tyle(short color) {return titleStyle;}/*** 数据行样式** @param parity 可以用来表示奇偶行* @param entity 数据内容* @return 样式*/@Overridepublic CellStyle getStyles(boolean parity, ExcelExpo rtEntity entity) {return styles;}/*** 获取样式方法** @param dataRow 数据行* @param obj 对象* @param data 数据*/@Overridepublic CellStyle getStyles(Cell cell, int dataRow, Exc elExportEntity entity, Object obj, Object data) {return getStyles(t rue, entity);}/*** 模板使用的样式设置*/@Overridepublic CellStyle getT emplateStyles(boolean isSingle, ExcelForEachParams excelForEachParams) {return null;}/*** 初始化--大标题样式** @param workbook* @return*/private CellStyle initHeaderStyl e(Workbook workbook) {CellStyle style = getBaseCellStyle(work book);style.setFont(getFont(workbook, FONT_SIZE_TWELVE, tru e));return style;}/*** 初始化--每列标题样式** @param workbook* @return*/private CellStyle initTitleStyle( Workbook workbook) {CellStyle style = getBaseCellStyle(workbo ok);style.setFont(getFont(workbook, FONT_SIZE_ELEVEN, false)); //背景色 POI IndexedColors 编码与颜色枚举类对照 : https:///ju_362204801/article/details/1060791 71style.setFillForegroundColor(IndexedColors.PALE_BLUE.getInd ex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);re turn style;}/*** 初始化--数据行样式** @param workbook* @return*/private CellStyle initStyles(Wor kbook workbook) {CellStyle style = getBaseCellStyle(workbook); style.setFont(getFont(workbook, FONT_SIZE_TEN, false));style.se tDataFormat(STRING_FORMAT);return style;}/*** 基础样式** @return*/private CellStyle getBaseCellStyle(Workbook workb ook) {CellStyle style = workbook.createCellStyle();//下边框style.setBorderBottom(BorderStyle.THIN);//左边框style.setBorderLeft(BorderStyle.THIN);//上边框style.setBorderTop(BorderStyle.THIN);//右边框style.setBorderRight(BorderStyle.THIN);//水平居中style.setAlignment(HorizontalAlignment.CENTER);//上下居中style.setVerticalAlignment(VerticalAlignment.CENTER);//设置自动换行style.setWrapText(true);return style;}/*** 字体样式** @param size 字体大小* @param isBold 是否加粗* @return*/private Font getFont(Workbook workbook, short siz e, boolean isBold) {Font font = workbook.createFont();//字体样式font.setFontName("宋体");//是否加粗font.setBold(isBold);//字体大小font.setFontHeightInPoints(size);return font;}} 再说一下哈,上边面两个类虽然很长,但就是个工具类而已啦~ 不多说!你懂的!直接ctrl c、ctrl v四、测试导出方法的Controllerimport mon.collect.Lists;import com.qtyc.u tils.ExcelUtils;import org.springframework.web.bind.annotation. RequestMapping;import org.springframework.web.bind.annotat ion.RequestMethod;import org.springframework.web.bind.anno tation.RestController;import javax.servlet.http.HttpServletRespo nse;import java.util.Date;import java.util.List;/*** 导出Excel测试Controller** @author caoju*/@RestControllerpublic class ExcelE xportController {/*** 导出Excel测试*/@RequestMapping(value = "/exportExcelTest", method = Req uestMethod.GET)public void exportExcelTest(HttpServletRespon se response) {List<User> personList = this.findUser();ExcelUtils.e xportExcel(ExcelUtils.getWorkbook("用户信息列表", "用户信息", User.class, personList), "用户信息列表导出", response);}/*** 模拟数据库查询返回用户信息*/private List<User> findUser() {List<User> list = Lists.newArray List();User user = new User();user.setId(10);user.setName("张三");user.setSex(1);user.setCreateTime(new Date());list.add(user);Us er user1 = new User();user1.setId(26);user1.setName("李四");user1.setSex(1);user1.setCreateTime(new Date());list.add(user1 );User user2 = new User();user2.setId(28);user2.setName("王丽");user2.setSex(2);user2.setCreateTime(new Date());list.add(user2 );return list;}}五、测试浏览器输入:可以看到浏览器左下角弹出了下载窗口,自动下载了Excel打开下载的文件夹可以看到刚才下载的Excel打开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 Excel API的数据库数据导入导出方法研究与实现

基于Java Excel API的数据库数据导入导出方法研究与实现作者:张明辉王清心王正玉来源:《现代电子技术》2012年第04期摘要:在Web应用系统中,用户们经常要求将数据库数据进行导入导出处理。
Microsoft Excel是用户非常熟悉的办公软件,因此,Excel作为数据库数据导入导出的中间介质成为最佳选择。
为了达到此目的,采用Java Excel API操作Excel文件的方法,实现了仅通过在客户端的操作,将数据库中的数据导出到Excel表格中,并将Excel表格中的数据导入数据库的功能。
满足了用户进行数据库数据导入导出的要求。
关键词:Java Excel API;数据库;数据导入;数据导出中图分类号:文献标识码:A文章编号:Implementation of data import and export from database based on Java Excel API(College of Information Engineering and Automation, Kunming University of Technology, Kunming 650051, China)Abstract: In Web application system, clients always call for the data import and export from a database. Microsoft Excel is an office software which is very familiar to many clients, so Excel as a intermedia becomes the first option for data import and export from database. In order to achieve the goal, this method is adopted to operate Excel by Java Excel API. Only through the process on the client side, can the data be exported from database into Excel and data be imported from Excel into database. It meet the requirements of clients for data import and export.Keywords: Java Excel API; database; data import; data export收稿日期:引言Microsoft Excel是Microsoft Office系列办公软件重要成员之一,Excel可以用来存储,管理,计算,分析各种数据文件,拥有着极大的用户群体。
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列较多时,会出现内存溢出。
用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使用EasyExcel导入导出excel

java使⽤EasyExcel导⼊导出excel ⽬录⼀、准备⼯作1、导包⼆、了解注解1、常⽤注解2、@ExcelProperty注解3、@ColumnWith注解4、@ContentFontStyle注解5、@ContentStyle注解6、@HeadFontStyle注解7、ExcelIgnore注解三、编码1、映射实体类----例⼦2、⽣成excel四、结果⼀、准备⼯作1、导包<!-- poi 相关--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><!-- esayexcel 2.1.7 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version></dependency>⼆、了解注解1、常⽤注解字段注解类注解@ColumnWith(列宽)@ColumnWidth(全局列宽)@ExcelProperty(字段配置)@HeadFontStyle(头样式)@HeadRowHeight(标题⾼度)@ContentFontStyle(内容字体样式)@ContentRowHeight(内容⾼度)2、@ExcelProperty注解必要的⼀个注解,注解中有三个参数value,index分别代表列明,列序号value和index只能⼆选⼀,通常不⽤设置converter1.value 通过标题⽂本对应2.index 通过⽂本⾏号对应@ExcelProperty(value = "编号", index = 0)private Long id;3、@ColumnWith注解设置列宽度,只有⼀个参数value,value的单位是字符长度,最⼤可以设置255个字符,因为⼀个excel单元格最⼤可以写⼊的字符个数就是255个字符public class ImeiEncrypt {@ColumnWidth(value = 255) //excel单个单元格最⼤长度255private String message;}4、@ContentFontStyle注解⽤于设置单元格内容字体格式的注解参数含义fontName字体名称fontHeightInPoints字体⾼度italic是否斜体strikeout是否设置删除⽔平线color字体颜⾊typeOffset偏移量underline下划线bold是否加粗charset编码格式5、@ContentStyle注解设置内容格式注解参数含义dataFormat⽇期格式hidden设置单元格使⽤此样式隐藏locked设置单元格使⽤此样式锁定quotePrefix在单元格前⾯增加`符号,数字或公式将以字符串形式展⽰horizontalAlignment设置是否⽔平居中wrapped设置⽂本是否应换⾏。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java实现Excel数据导入导出的研究与应用王晶晶北京邮电大学网络教育学院(100088)E-mail:bolalisi_double@摘要:Excel能够通过功能强大的工具将杂乱的数据组织成有用的信息,然后分析、交流和共享所得到的结果。
很多系统由于存在着大量需要处理的数据,Excel本身强大的功能使得它成为处理分析这些数据首选的工具。
随着Java语言成为越来越多系统的开发语言,利用Java进行Excel的数据导入导出在很多系统中都发挥着重要的作用,本文主要介绍了Jxl API的主要功能,并结合实例探讨了利用Jxl API操作Excel数据的导入和导出。
关键字:Java;Excel; Jxl API;数据导入导出中图分类号:TP312文献标识码:A1. 引言MS的电子表格(Excel)是Office的重要成员,是保存统计数据的一种常用格式。
在一个Java应用中,将一部分数据生成Excel格式,是与其他系统无缝连接的重要手段。
在远程网络教学系统中,利用Excel表格统计学生的作业考试情况信息,便于老师了解学生的学习情况,分析教学效果,制定教学计划。
所以,用Java操作Excel表格,导出相关的信息对于远程网络教育系统有着的很重要的意义。
在开源世界中,有两套比较有影响的API提供Excel数据导入导出的功能,一个是POI,一个是jExcelAPI。
本文结合基于J2EE开发的多媒体教学系统中提供的将学生作业信息导出到Excel表格中的实例,详细阐述了利用JAVA开发的jExcelAPI操作excel的方法。
2. Jxl 简介2.1 Java语言简介Java语言具有面向对象、与平台无关、安全、稳定和多线程等优良特性,是目前软件设计中极为强大的编程语言[1]。
它具有以下一些特点[2]:简单,面向对象,分布式,解释执行,鲁棒,安全,体系结构中立,可移植,高性能,多线程以及动态性。
2.2什么是JxlJava Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。
使用该 API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。
因为是使用Java编写的,所以我们在Web应用中可以通过JSP、 Servlet来调用API实现对Excel数据表的访问。
Jxl发布的稳定版本是V2.0,提供以下功能:从Excel 95、97、2000等格式的文件中读取数据[3];读取Excel公式(可以读取Excel 97以后的公式)[3];生成Excel数据表(格式为Excel 97)[3];支持字体、数字、日期的格式化[3];支持单元格的阴影操作,以及颜色操作[3];修改已经存在的数据表。
2.3代码举例2.3.1从Excel文件读取数据表Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel 数据表。
读取Excel数据表的第一步是创建Workbook(术语:工作薄),相关文献中给出了部分事例介绍[4],下面的代码片段举例说明了应该如何操作:import java.io.*;import jxl.*;… … … …try{//构建Workbook对象, 只读Workbook对象//直接从本地文件创建Workbook//从输入流创建WorkbookInputStream is = new FileInputStream(sourcefile);jxl.Workbook rwb = Workbook.getWorkbook(is);}catch (Exception e){e.printStackTrace();}一旦创建了Workbook,我们就可以通过它来访问Excel Sheet(术语:工作表)。
代码如下://获取第一张Sheet表Sheet rs = rwb.getSheet(0);我们既可能通过Sheet的名称来访问它,也可以通过下标来访问它。
如果通过下标来访问的话,要注意的一点是下标从0开始,就像数组一样。
一旦得到了Sheet,我们就可以通过它来访问Excel Cell(术语:单元格)。
代码如下://获取第一行,第一列的值Cell c00 = rs.getCell(0, 0);String strc00 = c00.getContents();//获取第一行,第二列的值Cell c10 = rs.getCell(1, 0);String strc10 = c10.getContents();//获取第二行,第二列的值Cell c11 = rs.getCell(1, 1);String strc11 = c11.getContents();如果仅仅是取得Cell的值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回。
示例代码中 Cell(0, 0)是文本型,Cell(1, 0)是数字型,Cell(1,1)是日期型,通过getContents(),三种类型的返回值都是字符型。
当完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。
//操作完成时,关闭对象,释放占用的内存空间rwb.close();2.3.2 生成新的Excel工作薄与读取Excel工作表相似,首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象,相关文献中给出了事例介绍[4],具体代码如下:try{//构建Workbook对象, 只读Workbook对象//Method 1:创建可写入的Excel工作薄jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));//Method 2:将WritableWorkbook直接写入到输出流/*OutputStream os = new FileOutputStream(targetfile);jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);*/}catch (Exception e){e.printStackTrace();}//创建Excel工作表jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);//1.添加Label对象bel labelC = new bel(0, 0, "This is a Label cell");ws.addCell(labelC);//添加带有字型Formatting的对象jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES,18, WritableFont.BOLD, true);jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);bel labelCF = new bel(1, 0, "This is a Label Cell", wcfF);ws.addCell(labelCF);2.3.3单元格操作1)合并单元格WritableSheet.mergeCells(int m,int n,int p,int q);作用是从(m,n)到(p,q)的单元格全部合并,比如:WritableSheet sheet=book.createSheet(“第一页”,0) [5];//合并第一列第一行到第六列第一行的所有单元格sheet.mergeCells(0,0,5,0);合并既可以是横向的,也可以是纵向的。
合并后的单元格不能再次进行合并,否则会触发异常。
2)行高和列宽WritableSheet.setRowView(int i,int height);作用是指定第i+1行的高度,比如://将第一行的高度设为200[5]sheet.setRowView(0,200);WritableSheet.setColumnView(int i,int width);作用是指定第i+1列的宽度,比如://将第一列的宽度设为30[5]sheet.setColumnView(0,30);3. 应用实例本文所举的实例为网上多媒体教学系统中对于学生作业导出信息的实现。
3.1 系统界面及导出表实例下图1为导出功能的入口:点击导出此次作业的成绩按钮,就会触发相应的动作,进行数据表的导出图1 导出功能入口下图2为系统导出的表格的结构图2 系统导出Excel表格结构3.2 实现代码导出之前首先要定义一个SingleTaskScoreExportInfo对象,用来存放从数据库中查询出来的导出表需要的相关字段的信息。
它是作业接收者对象的一个子集,只包含了作业接收者对象中学号,姓名,班级,作业标题,完成时间,分数,查看次数等信息。
为数据导出按钮连接消息处理函数:函数主要包括生成工作表,调用方法从数据库中将对应某次作业的作业接收者的信息查找出来,并用相关的属性初始化SingleTaskScoreExportInfo对象,放在结果集中,构造循环将查询到的结果集中的对象写入到Excel表格中。
以下是实现的主要代码://定义表格名称为作业成绩,创建工作薄String filename="作业成绩";response.setHeader("Content-Disposition" ,"attachment;filename="+new String(filename.getBytes(),"iso8859-1")+".xls");OutputStream os=response.getOutputStream();WritableWorkbook wwb=Workbook.createWorkbook(os);//创建工作表,并写入相应的表头字段WritableSheet sheet=wwb.createSheet("所有成绩", 0);String []title={"学号","班级","姓名","作业标题","完成时间","分数","次数"};for (int j = 0; j < title.length; j++) {// 在sheet中写标题栏sheet.addCell(new Label(j, 0, title[j], arial12format));}//查询需要的数据,放在List结果集中List<SingleTaskScoreExportInfo> scores = studyManager.getSingleTaskScoresByCourse(courseId,taskId);//将相关的信息写入到工作表SingleTaskScoreExportInfo item;int row=1;for (it = scores.iterator(); it.hasNext();) {item = (SingleTaskScoreExportInfo) it.next();if(!"".equals(item.getStudentNum())&&null!=item.getStudentNum()){//添加学号Label label = new Label(0, row, item.getStudentNum());20);sheet.setColumnView(0,sheet.addCell(label);//添加班级label = new Label(1, row, item.getClassGroupName());50);sheet.setColumnView(1,sheet.addCell(label);//添加姓名label = new Label(2,row,item.getStudentName());10);sheet.setColumnView(2,sheet.addCell(label);//添加作业标题label = new Label(3,row,item.getTaskTitle());30);sheet.setColumnView(3,sheet.addCell(label);// 添加完成时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");WritableCellFormat wc = new WritableCellFormat();wc.setAlignment(Alignment.CENTRE);sheet.setColumnView(4,30);if(item.getFinishTime()!=null){String newdate = sdf.format(item.getFinishTime());label = new Label(4,row,newdate,wc);sheet.addCell(label); }else{label=new Label(4,row,"未查看此次作业",wc);sheet.addCell(label);}//添加分数Number score = new Number(5, row, item.getScore(), wcf);double score_temp=score.getValue();if(0<score_temp&&score_temp<0.6){ sheet.addCell(new Number(5, row, score_temp*100, redFormat)); } else if (item.getFinishTime()==null){sheet.addCell(new Number(5, row, -1, redFormat));} else if(item.getFinishTime()!=null&&(score_temp==0||"".equals(item.getScore()))){sheet.addCell(new Number(5, row, (double)0, redFormat));}else sheet.addCell(new Number(5, row, score_temp*100, wcf));//添加查看次数Number homeWorkTimes = new Number(6, row, item.getHomeWorkTimes());sheet.addCell(homeWorkTimes);}row++;// 指针下移}//导出后关闭对象,释放内存wwb.write();wwb.close();os.close();4. 小结Jxl提供了有关Java操纵Excel的大多数类,可以方便地进行数据读写,单元格格式定义。