利用Java进行Excel的数据导入导出 ppt课件
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,可以到下载。
HutoolJava工具类库导出Excel并合并数据,全网最详细!

HutoolJava⼯具类库导出Excel并合并数据,全⽹最详细!ps:基于HuTool⼯具类ExcelWriter合并单元格并且使⽤ jdk1.8 lambda表达式⼀、原始数据模板⼆、合并后的数据按照班级名称、班级分数、⼩组名称、⼩组得分、⼈物名称、⼈物总分进⾏单元格合并合并后效果:三、导⼊依赖ps:pom依赖版本不合适可以换其他版本导出是项⽬中最常见的功能,例如考勤记录导出,账单明细导出,订单记录导出等等。
导出的⼯具类有许多种,⽬前常见的有poi,easypoi,poi...,今天我要说的是基于hutool-poi的导出,hutool-poi是将poi做了封装,简化了⼤量的代码编写。
使⽤⽅式:maven在项⽬的pom.xml中引⼊<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.1</version></dependency>gradle在项⽬的build.gradle中引⼊compile 'cn.hutool:hutool-all:5.7.3'四、代码逻辑1.查找数据库返回数据voList;2.设置导出表头数据;3.⽤lambda表达式获取字段分组数据;4.遍历数据,设置合并规则;5.将数据保存在list中;6.ExcelWriter导出excel⽂件五、代码1.需实现将⼈物信息导出到excel⽂件中并且还要按照班级名称,⼩组名称,⼈物名称动态合并单元格,所以先创建⼈物对象:@Data@AllArgsConstructor //⽣成所有参数的构造器public class Person {//班级名称private String className;//班级分数private double classScore;//⼩组名称private String groupName;//⼩组分数private double groupScore;//⼈物姓名private String personName;//⼈物总分private double personScore;//学科名称private String subjectName;//学科分数private double subjectScore;}2.导出核⼼代码:@Slf4j@RestController@RequestMapping("/person")public class PersonController {/*** 将页⾯的数据导出并合并单元格* @param response*/@ApiOperation(value = "导出数据到excel")@ApiImplicitParams({@ApiImplicitParam(name = "response", value = "响应体对象", dataType = "HttpServletResponse")})@GetMapping("/export")public void export(HttpServletResponse response)throws Exception{//1.模拟⼀些⼈物对象数据(⼯作中从数据库查出来)List<Person> list = new ArrayList<>();list.add(new Person("⼀班",90,"⼀组",89,"孙悟空",89,"语⽂",89));list.add(new Person("⼀班",90,"⼀组",89,"孙悟空",89,"数学",98));list.add(new Person("⼀班",90,"⼀组",89,"唐僧",78,"语⽂",98));list.add(new Person("⼀班",90,"⼀组",89,"唐僧",78,"数学",78));list.add(new Person("⼀班",90,"⼆组",90,"沙悟净",90,"语⽂",90));list.add(new Person("⼀班",90,"⼆组",90,"沙悟净",90,"数学",90));list.add(new Person("⼆班",91,"⼀组",97,"鲁智深",98,"语⽂",89));list.add(new Person("⼆班",91,"⼀组",97,"鲁智深",98,"数学",98));list.add(new Person("⼆班",91,"⼆组",89,"宋江",89,"语⽂",98));list.add(new Person("⼆班",91,"⼆组",89,"宋江",89,"数学",78));list.add(new Person("⼆班",91,"⼆组",89,"林冲",88,"语⽂",90));list.add(new Person("⼆班",91,"⼆组",89,"林冲",88,"数学",90));//2.定义基础数据List<String> rowHead = CollUtil.newArrayList("班级名称","班级分数","⼩组名称","⼩组分数","⾓⾊姓名","⾓⾊总分","学科名称","学科分数");//3.通过ExcelUtil.getBigWriter()创建Writer对象,BigExcelWriter⽤于⼤数据量的导出,不会引起溢出;ExcelWriter writer = ExcelUtil.getBigWriter();//4.写⼊标题writer.writeHeadRow(rowHead);ServletOutputStream out = null;//5.实现核⼼逻辑try {//6.定义容器保存⼈物数据List<List<Object>> rows = new LinkedList<>();//7.按照班级进⾏分组LinkedHashMap<String, List<Person>> classList = list.stream().collect(Collectors.groupingBy(item -> item.getClassName(),LinkedHashMap::new, Collectors.toList()));//8.定义起始⾏(⽅便分组后合并时从哪⼀⾏开始)//因为标题已经占了⼀⾏,所以数据从第⼆⾏开始写(excel第⼀⾏索引为0)//因需要合并到⼈物分数单元格所以需定义如下起始坐标int indexClassName = 1; //班级名称起始⾏int indexClassScore = 1;int indexGroupName = 1;int indexGroupScore = 1;int indexPersonName = 1;int indexPersonScore = 1;//9.遍历按班级名分组后的list(⽤entrySet效率⽐keySet效率⾼)for (Map.Entry<String, List<Person>> classNameListEntry : classList.entrySet()) {//10.获取按照班级名分组后的集合List<Person> classValue = classNameListEntry.getValue();//11.计算此集合的长度int classSize = classValue.size();//12.如果只有⼀⾏数据不能调⽤merge⽅法合并数据,否则会报错if (classSize == 1){indexClassName += classSize;indexClassScore += classSize;indexGroupName += classSize;indexGroupScore += classSize;indexPersonName += classSize;indexPersonScore += classSize;}else{//13.根据班级名称进⾏合并单元格//合并⾏,第⼀个参数是合并⾏的开始⾏号(⾏号从0开始),第⼆个参数是合并⾏的结束⾏号,第三个参数是合并的列号开始(列号从0开始), //第四个参数是合并的列号结束,第五个参数是合并后的内容,null不设置,第六个参数指是否⽀持设置样式,true指的是。
java自定义注解在excel导出时的使用

java自定义注解在excel导出时的使用在Java中,自定义注解是一种用于在程序中进行标记的机制。
通过定义自己的注解,可以为类、方法、字段等元素添加元数据,用于描述它们的特性和行为。
在Excel导出时,自定义注解可以用来定义导出的字段和格式,并且可以通过反射机制来读取注解信息,实现自动导出的功能。
下面是一个简单的自定义注解示例:```javaimport ng.annotation.*;String name( default ""; // 导出字段的名称int width( default 20; // 导出字段的宽度String format( default ""; // 导出字段的格式```定义了注解之后,可以在需要导出的类中使用该注解对字段进行标记。
例如:```javapublic class Userprivate String name;private int age;//其他字段和方法...```接下来,可以编写一个用于导出Excel的工具类。
该类可以使用反射来读取类的字段和注解信息,并根据注解信息生成相应的Excel文件。
以下是一个简单的Excel导出工具类示例:```javapublic class ExcelExportUtilpublic static <T> void exportToExcel(List<T> data, Class<T> clazz, String filePath)//创建工作簿和工作表Workbook workbook = new HSSFWorkbook(;Sheet sheet = workbook.createSheet("Sheet1");//获取类的字段和注解信息Field[] fields = clazz.getDeclaredFields(;for (int i = 0; i < fields.length; i++)Field field = fields[i];ExcelField excelField =field.getAnnotation(ExcelField.class);if (excelField != null)//获取注解信息String fieldName = (;int width = excelField.width(;//设置列宽sheet.setColumnWidth(i, width * 256);//创建表头单元格Row headerRow = sheet.getRow(0);if (headerRow == null)headerRow = sheet.createRow(0);}Cell headerCell = headerRow.createCell(i); headerCell.setCellValue(fieldName);}}//创建数据行for (int i = 0; i < data.size(; i++)T item = data.get(i);Row dataRow = sheet.getRow(i + 1);if (dataRow == null)dataRow = sheet.createRow(i + 1);}for (int j = 0; j < fields.length; j++)Field field = fields[j];if (field.isAccessible()try//获取字段值Object value = field.get(item);//创建数据单元格并填充数据Cell dataCell = dataRow.createCell(j); if (value instanceof String) dataCell.setCellValue((String) value); } else if (value instanceof Integer) dataCell.setCellValue((int) value);} else if (value instanceof Double) dataCell.setCellValue((double) value); }} catch (IllegalAccessException e)e.printStackTrace(;}}}}// 保存Excel文件try (FileOutputStream outputStream = newFileOutputStream(filePath))workbook.write(outputStream);} catch (IOException e)e.printStackTrace(;}}```在上面的示例中,exportToExcel方法接收一个泛型列表和类的字节码对象,通过反射来读取类的字段和注解信息,并根据注解信息生成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文件,其中包含一个跨行和跨列的单元格。
java导出excel浏览器直接下载或者或以文件形式导出

java导出excel浏览器直接下载或者或以⽂件形式导出看代码吧~/*** excel表格直接下载*/public static void exportExcelByDownload(HSSFWorkbook wb,HttpServletResponse httpServletResponse,String fileName) throws Exception {//响应类型为application/octet- stream情况下使⽤了这个头信息的话,那就意味着不想直接显⽰内容httpServletResponse.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);//attachment为以附件⽅式下载httpServletResponse.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName + ".xls","utf-8"));/*** 代码⾥⾯使⽤Content-Disposition来确保浏览器弹出下载对话框的时候。
* response.addHeader("Content-Disposition","attachment");⼀定要确保没有做过关于禁⽌浏览器缓存的操作*/httpServletResponse.setHeader("Cache-Control", "No-cache");httpServletResponse.flushBuffer();wb.write(httpServletResponse.getOutputStream());wb.close();}/*** excel以⽂件的形式导出* @throws Exception*/public static void exportExcelByFile(HSSFWorkbook wb,String fileName,String path) throws Exception{ByteArrayOutputStream stream = new ByteArrayOutputStream();wb.write(stream);FileOutputStream outputStream = new FileOutputStream(path + fileName);outputStream.write(stream.toByteArray());stream.close();outputStream.close();}java查询数据导出excel并返回给浏览器下载效果图:1.点击导出表按钮2.接着就会出现下图3.点击上图中的确定按钮再接着就会出现下图4.点击上图中的保存按钮接着就会出现下图,浏览器下载完成后的提⽰5.打开下载好的⽂件如下图好了,废话不多少,上代码jsp前端代码<div style="height:30px;"><a>时间:</a><input id="startDateConsume" type="text" class="easyui-datebox"> <a>-</a><input id="endDateConsume" type="text" class="easyui-datebox"><a>消费类型:</a><select id="consumesType" name=""><option value="0" selected="selected">所有</option><option value="1">报名费</option><option value="2">酒⽔零⾷类</option></select><a>⽀付状态:</a><select id="conPaymentStatus" name=""><option value="0" selected="selected">所有</option><option value="1">未⽀付</option><option value="2">已⽀付</option></select><a id="btnConsumesSearch" class="easyui-linkbutton"data-options="iconCls:'icon-search'" style="margin-left:10px">查询</a><a>(查询出来的数据可统计)</a><a id="consumesOutExcel" class="easyui-linkbutton" style="" data-options="iconCls:'icon-redo'">导出表</a></div>js前端代码$(function() {//导出excel表$('#consumesOutExcel').on('click',function(){exportExcel();});});function exportExcel() {$.messager.confirm('确认', '确认把该搜索结果导出Excel表格?', function(r) {if (r) {var startTime = $('#startDateConsume').val();var endTime = $('#endDateConsume').val();var consumesType = $('#consumesType').val();var conPaymentStatus = $('#conPaymentStatus').val();$.messager.progress({title : '处理中',msg : '请稍后',});$.messager.progress('close');location.href="web/vip/exportExcel.xlsx?startTime=" rel="external nofollow" +startTime+"&endTime="+endTime+"&consumesType="+consumesType+"&conPaymentStatus="+conPaymentStatus; }});}java后端代码@Controller@RequestMapping("/vip")public class VipController {//⽂件下载:导出excel表@RequestMapping(value = "/exportExcel.xlsx",method = RequestMethod.GET)@ResponseBodypublic void exportExcel(HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException{//⼀、从后台拿数据if (null == request || null == response){return;}List<VipConsumes> list = null;String startTime = request.getParameter("startTime");String endTime = request.getParameter("endTime");int consumesType = Integer.parseInt(request.getParameter("consumesType"));int conPaymentStatus =Integer.parseInt(request.getParameter("conPaymentStatus"));VipConsumesExample example = new VipConsumesExample();if(consumesType!=0 && conPaymentStatus!=0){example.createCriteria().andTimeBetween(startTime, endTime).andConsumeTypeEqualTo(consumesType).andStatusEqualTo(conPaymentStatus);}else if(consumesType ==0 && conPaymentStatus!=0) {example.createCriteria().andTimeBetween(startTime, endTime).andStatusEqualTo(conPaymentStatus);}else if(consumesType!=0 && conPaymentStatus==0){example.createCriteria().andTimeBetween(startTime, endTime).andConsumeTypeEqualTo(consumesType);}else {example.createCriteria().andTimeBetween(startTime, endTime);}list = this.vipConsumesDao.selectByExample(example);//⼆、数据转成excelrequest.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("application/x-download");String fileName = "消费记录.xlsx";fileName = URLEncoder.encode(fileName, "UTF-8");response.addHeader("Content-Disposition", "attachment;filename=" + fileName); // 第⼀步:定义⼀个新的⼯作簿XSSFWorkbook wb = new XSSFWorkbook();// 第⼆步:创建⼀个Sheet页XSSFSheet sheet = wb.createSheet("startTimeendTime");sheet.setDefaultRowHeight((short) (2 * 256));//设置⾏⾼sheet.setColumnWidth(0, 4000);//设置列宽sheet.setColumnWidth(1,5500);sheet.setColumnWidth(2,5500);sheet.setColumnWidth(3,5500);sheet.setColumnWidth(11,3000);sheet.setColumnWidth(12,3000);sheet.setColumnWidth(13,3000);XSSFFont font = wb.createFont();font.setFontName("宋体");font.setFontHeightInPoints((short) 16);XSSFRow row = sheet.createRow(0);XSSFCell cell = row.createCell(0);cell.setCellValue("流⽔号 ");cell = row.createCell(1);cell.setCellValue("微信名 ");cell = row.createCell(2);cell.setCellValue("微信订单号");cell = row.createCell(3);cell.setCellValue("消费时间");cell = row.createCell(4);cell.setCellValue("消费类型");cell = row.createCell(5);cell.setCellValue("剩余积分 ");cell = row.createCell(6);cell.setCellValue("新增积分 ");cell = row.createCell(7);cell.setCellValue("扣除积分 ");cell = row.createCell(8);cell.setCellValue("消费⾦额");cell = row.createCell(9);cell.setCellValue("⽀付⽅式");cell = row.createCell(10);cell.setCellValue("⽀付状态 ");cell = row.createCell(11);cell.setCellValue("钱包原始⾦额");cell = row.createCell(12);cell.setCellValue("钱包扣除⾦额");cell = row.createCell(13);cell.setCellValue("钱包剩余⾦额");XSSFRow rows;XSSFCell cells;for (int i = 0; i < list.size(); i++) {// 第三步:在这个sheet页⾥创建⼀⾏rows = sheet.createRow(i+1);// 第四步:在该⾏创建⼀个单元格cells = rows.createCell(0);// 第五步:在该单元格⾥设置值cells.setCellValue(list.get(i).getConsumeId());cells = rows.createCell(1);cells.setCellValue(list.get(i).getName());cells = rows.createCell(2);cells.setCellValue(list.get(i).getOrderNumber());cells = rows.createCell(3);cells.setCellValue(list.get(i).getTime());cells = rows.createCell(4);if (list.get(i).getConsumeType() == 2) {cells.setCellValue("酒⽔零⾷费");} else {cells.setCellValue("报名费");}cells = rows.createCell(5);cells.setCellValue(list.get(i).getIntegral());cells = rows.createCell(6);cells.setCellValue(list.get(i).getIntegralIn());cells = rows.createCell(7);cells.setCellValue(list.get(i).getIntegralOut());cells = rows.createCell(8);cells.setCellValue(list.get(i).getMoney());cells = rows.createCell(9);if (list.get(i).getPayment() == 2) {cells.setCellValue("积分抵现");} else if (list.get(i).getPayment() == 3) {cells.setCellValue("微信⽀付");} else if (list.get(i).getPayment() == 4) {cells.setCellValue("现⾦");} else if (list.get(i).getPayment() == 1) {cells.setCellValue("钱包");}cells = rows.createCell(10);if (list.get(i).getStatus() == 2) {cells.setCellValue("已⽀付");} else if (list.get(i).getStatus() == 1) {cells.setCellValue("未⽀付");}cells = rows.createCell(11);cells.setCellValue(list.get(i).getWalletOriginal());cells = rows.createCell(12);cells.setCellValue(list.get(i).getWalletOut());cells = rows.createCell(13);cells.setCellValue(list.get(i).getWalletSurplus());}try {OutputStream out = response.getOutputStream();wb.write(out);out.close();wb.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
基于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动态生成带下拉框的Excel导入模板

java动态⽣成带下拉框的Excel导⼊模板在实际开发中,由于业务需要,常常需要进⾏Excel导⼊导出操作。
以前做⼀些简单的导⼊时,先准备⼀个模板,再进⾏导⼊,单有⼗⼏、⼆⼗⼏个导⼊模板时,往往要做⼗⼏、⼆⼗⼏个模板。
⽽且,当在模板中需要有下拉框,⽽且下拉数据要实时查询时,这样的⽅法就不太好了;现在,做成了动态⽣成导⼊模板,只要参数传对了,就可以⽣成任何我们想要的导⼊模板,⽽且随意设置下拉框的数⽬、位置。
具体步骤如下:1、需要⽤到的jar包:poi-3.10-FINAL.jarpoi-ooxml-3.10-FINAL.jarpoi-ooxml-schemas-3.10-FINAL.jargradle引⼊:compile group: 'org.apache.poi', name: 'poi', version: '3.10'compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.10-FINAL'2、⽣成Excel导⼊模板 :/*** @Title: createExcelTemplate* @Description: ⽣成Excel导⼊模板* @param@param filePath Excel⽂件路径* @param@param handers Excel列标题(数组)* @param@param downData 下拉框数据(数组)* @param@param downRows 下拉列的序号(数组,序号从0开始)* @return void* @throws*/private static void createExcelTemplate(String filePath, String[] handers,List<String[]> downData, String[] downRows){HSSFWorkbook wb = new HSSFWorkbook();//创建⼯作薄//表头样式HSSFCellStyle style = wb.createCellStyle();style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建⼀个居中格式//字体样式HSSFFont fontStyle = wb.createFont();fontStyle.setFontName("微软雅⿊");fontStyle.setFontHeightInPoints((short)12);fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);style.setFont(fontStyle);//新建sheetHSSFSheet sheet1 = wb.createSheet("Sheet1");HSSFSheet sheet2 = wb.createSheet("Sheet2");HSSFSheet sheet3 = wb.createSheet("Sheet3");//⽣成sheet1内容HSSFRow rowFirst = sheet1.createRow(0);//第⼀个sheet的第⼀⾏为标题//写标题for(int i=0;i<handers.length;i++){HSSFCell cell = rowFirst.createCell(i); //获取第⼀⾏的每个单元格sheet1.setColumnWidth(i, 4000); //设置每列的列宽cell.setCellStyle(style); //加样式cell.setCellValue(handers[i]); //往单元格⾥写数据}//设置下拉框数据String[] arr = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};int index = 0;HSSFRow row = null;for(int r=0;r<downRows.length;r++){String[] dlData = downData.get(r);//获取下拉对象int rownum = Integer.parseInt(downRows[r]);if(dlData.length<5){ //255以内的下拉//255以内的下拉,参数分别是:作⽤的sheet、下拉内容数组、起始⾏、终⽌⾏、起始列、终⽌列sheet1.addValidationData(setDataValidation(sheet1, dlData, 1, 50000, rownum ,rownum)); //超过255个报错} else { //255以上的下拉,即下拉列表元素很多的情况//1、设置有效性//String strFormula = "Sheet2!$A$1:$A$5000" ; //Sheet2第A1到A5000作为下拉列表来源数据String strFormula = "Sheet2!$"+arr[index]+"$1:$"+arr[index]+"$5000"; //Sheet2第A1到A5000作为下拉列表来源数据sheet2.setColumnWidth(r, 4000); //设置每列的列宽//设置数据有效性加载在哪个单元格上,参数分别是:从sheet2获取A1到A5000作为⼀个下拉的数据、起始⾏、终⽌⾏、起始列、终⽌列 sheet1.addValidationData(SetDataValidation(strFormula, 1, 50000, rownum, rownum)); //下拉列表元素很多的情况//2、⽣成sheet2内容for(int j=0;j<dlData.length;j++){if(index==0){ //第1个下拉选项,直接创建⾏、列row = sheet2.createRow(j); //创建数据⾏sheet2.setColumnWidth(j, 4000); //设置每列的列宽row.createCell(0).setCellValue(dlData[j]); //设置对应单元格的值} else { //⾮第1个下拉选项int rowCount = sheet2.getLastRowNum();//System.out.println("========== LastRowNum =========" + rowCount);if(j<=rowCount){ //前⾯创建过的⾏,直接获取⾏,创建列//获取⾏,创建列sheet2.getRow(j).createCell(index).setCellValue(dlData[j]); //设置对应单元格的值} else { //未创建过的⾏,直接创建⾏、创建列sheet2.setColumnWidth(j, 4000); //设置每列的列宽//创建⾏、创建列sheet2.createRow(j).createCell(index).setCellValue(dlData[j]); //设置对应单元格的值}}}index++;}}try {File f = new File(filePath); //写⽂件//不存在则新增if(!f.getParentFile().exists()){f.getParentFile().mkdirs();}if(!f.exists()){f.createNewFile();}FileOutputStream out = new FileOutputStream(f);out.flush();wb.write(out);out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}3、设置有效性:/**** @Title: SetDataValidation* @Description: 下拉列表元素很多的情况 (255以上的下拉)* @param@param strFormula* @param@param firstRow 起始⾏* @param@param endRow 终⽌⾏* @param@param firstCol 起始列* @param@param endCol 终⽌列* @param@return* @return HSSFDataValidation* @throws*/private static HSSFDataValidation SetDataValidation(String strFormula,int firstRow, int endRow, int firstCol, int endCol) {// 设置数据有效性加载在哪个单元格上。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下标来访
问的话,要注意的一点是下标从0 开始,就像数组一样。 一旦得到了 Sheet,我们就可以通过它来访问Excel Cell(术 语
:单元格)。代码如下: //获取第一行,第一列的值 Cell c00=rs.getCell(0, 0);
String strc00=
c00.getContents(); //获取第一行,第二列的值 Cell c10=rs.getCell(1, 0); String
Workbook.getWorkbook(is); } catch (Exception e) {e.printStackTrace(
);} 一旦创建了 Workbook,我们就可以通过它来访问Excel Sheet(术语: 工作表)。代码如 下:
//获取第一张She
et 表
Sheet rs=rwb.getSheet(0); 我们既可能通过Sheet 的名称来访问它,也可以通过下标 来访问它。如果通过
过纯Java 应用来处理Excel 数据表。因为是使用Java 编写 的,所以我们在Web 应用中可以 通过JSP、 Servlet 来调
用API 实现对Excel 数据表的访问。 Jxl 发布的稳定版本是V2.0,提供以下功能: 从 Excel 95、97、2000 等格
式的文件中读取数据[3]; 读取 Excel 公式(可以读取Excel 97 以后的公式)[3];生 成Excel 数据表(格式为Excel
ateSheet("Test Sheet 1", 0); //1.添加Label 对象 bel labelC=n
ew bel(0, 0, "This is a Label cell"); ws.addCell(labelC);
jxl.w
rite.WritableWorkbook wwb=Workbook.createWorkbook(new File(targetfile)
); //Method 2:将WritableWorkbook 直接写入到输出流 } catch (Exception e) {e.
printStackTrace();} //创建Excel 工作表 jxl.write.WritableSheet ws=wwb.cre
97)[3]; 支持字体、数字、日期的格式化[3]; 支持单元格的阴影操作,以及颜色操作[3]; 修改已经存在的数据表。
2.3
代码举例
2.3.1 从Excel 文件读取数据表 Java Excel API 既可以从本地文件系统的一个文件(.xls),也 可以从输
入流中读取Excel 数据表。读取Excel 数据表的第一步是创建Workbook(术语: 工作薄),相关文献中给出了 部分事例介绍[4]
strc10=c10.getContents();//获取第二行,第二列的值 Cell c11=rs.getCell(1, 1); St
ring strc11=c11.getContents(); 如果仅仅是取得Cell 的值,我们可以方便地通过 getContents()方
法,它可以将任何类型
1. 引言 MS 的电子表格(Excel)是Office 的重要成员,是保存统 计数据的一种常用格式。在一
个Java 应用中,将一部分数
据生成Excel 格式,是与其他系统无缝连接的重要手段。 在远程
网络教学系统中,利用Excel 表格统计学生的作业考试情 况信息,学效果,制定教学计划。所以,用Java 操 作Excel 表格,导出相关的信息对于 远程网络教育系统有着的很重要
的意义。
在开源世界中,有两套比较有影响的API 提供Excel 数据导 入导出的功能,一个是POI, 一个是jExcelAPI。本文结合
基于J2EE 开发的多媒体教学系统中提供的将学生作业信 息导出
到Excel 表格中的实例,详细阐述了利用JAVA 开发的 jExcelAPI
操作excel 的方法。 2. Jxl 简介 2.1 Java 语言简介 Java 语言具有面向对象、与平台无关、安全、稳定和多线程
,下面的代码片段举例说明了应该如何操作:
import java.io.*; import jxl.*; ………… try
{ //构建Workbook 对象, 只读Workbook 对象 //直接从本地文件创建Workbook //从输入流创建Workbo
ok InputStream is=new FileInputStream(sourcefile); jxl.Workbook rwb=
的Cell 值都作为一个字符串返回。示例代码中 Cell(0, 0)是 文本型,Cell(1, 0)是数字型, Ce
ll(1,1)是日期型,通过getContents(),三种类型的返回值 都是字符型。
当完成对 Excel 电子表格数据的处理后,一定要使
用close()方法来关闭先前创建的对象, 以释放读取数据表的过程中所占用的内存空间,在读取 大量数据时显得尤为重要。 //操作完成时,关
等优良特性,是目前软件设 计中极为强大的编程语言[1]。它具有以下一些特点[2]: 简单,面向对象,分布式,解释执行, 鲁棒,安全,体系结
构中立,可移植,高性能,多线程以及动态性。
2.2 什么是Jxl Java Excel 是一开放源码项目,通过它Java 开发人员可以 读
取Excel 文件的内容、创建 新的Excel 文件、更新已经存在的Excel 文件。使用该 API 非Windows 操作系统也可以通
闭对象,释放占用的内存空间
rwb.close(); 2.3.2 生成新的Excel 工作薄 与读取 Excel 工作表相似,首先要使
用Workbook 类的工厂方法创建一个可写入的工作 薄(Workbook)对象,相关文献中给出了事例介绍[4],具 体代码如下:
try
{ //构建Workbook 对象, 只读Workbook 对象 //Method 1:创建可写入的Excel 工作薄