JAVA-POI通用工具类
POI生成Excel文件:Excel,工具类,背景色,边框,居中,合并单元格
POI⽣成Excel⽂件:Excel,⼯具类,背景⾊,边框,居中,合并单元格背景今天分配到任务,要导出很多表格,懒得⼀个个写导出代码,故准备写个⼯具类⼯具类代码如下:1 package com.swyx.tools.utils.poi;23 import java.io.File;4 import java.io.FileOutputStream;5 import java.io.OutputStream;6 import java.util.List;7 import java.util.Map;89 import ermodel.HSSFCell;10 import ermodel.HSSFCellStyle;11 import ermodel.HSSFPalette;12 import ermodel.HSSFRow;13 import ermodel.HSSFSheet;14 import ermodel.HSSFWorkbook;15 import ermodel.BorderStyle;16 import ermodel.FillPatternType;17 import ermodel.HorizontalAlignment;18 import org.apache.poi.ss.util.CellRangeAddress;19 import org.apache.poi.ss.util.RegionUtil;2021 /**22 *23 * @author wangbaojun1992@24 * @version poi version : 4.1.025 */26 public class ExcelWriteUtil {2728 /**29 *30 * @param titleMape 标题⾏,为第⼀⾏标题内容与样式,参数Map<String,String>结构,字段如下:31 * {32 * value:内容值33 * backgroundColor:背景⾊,为RGB颜⾊,3个⾊值以","隔开,默认"189,215,238"34 * }35 * @param titleList 表头⾏,为第⼆⾏表头内容与样式,参数List<Map<String,String>>结构,字段如下:36 * [37 * {38 * value:内容值39 * backgroundColor:背景⾊,为RGB颜⾊,3个⾊值以","隔开,默认"189,215,238"40 * }41 * ]42 * @param contentList 内容,所有取值均被转换位String类型,参数List<List<String>>结构。
java poi生成excel筛选条件
java poi生成excel筛选条件Java POI生成Excel筛选条件在日常开发中,常常会遇到需要将数据导出为Excel文件的需求。
而使用Java的POI库可以方便地实现这一功能。
本文将通过一步一步的示例,介绍如何使用Java POI生成Excel筛选条件。
下面我们将详细阐述这一过程。
第一步:导入所需的依赖库在使用Java POI库之前,首先要在项目中导入所需的依赖库。
可以通过Maven等构建工具将POI库添加到项目依赖中。
在pom.xml文件中添加以下依赖:<dependencies><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></dependencies>第二步:创建工作簿和工作表在生成Excel文件之前,需要创建一个工作簿(Workbook)和一个工作表(Sheet)。
可以使用`XSSFWorkbook`类创建一个新的工作簿,使用`createSheet`方法创建一个新的工作表。
下面是示例代码:创建工作簿Workbook workbook = new XSSFWorkbook();创建工作表Sheet sheet = workbook.createSheet("Sheet1");第三步:创建数据行和列在工作表中,数据是以行和列的形式组织的。
《Java常用工具包大全》
《Java常用工具包大全》Java常用工具包大全Java发展至今已经有20多年的历史,而作为一个开源的编程语言,越来越多的工具包被开发出来,为我们的开发工作提供了便利和效率。
下面是Java常用工具包大全,包括了Java开发过程中最常用的各类工具包及其功能特性、使用场景和注意事项等。
一、Apache工具包Apache是世界著名的非营利组织,其旗下的工具包非常适合Java开发者使用。
除此之外,Apache还提供了广泛的文档和示例供开发者参考学习。
1. Apache CommonsApache Commons是Apache组织提供的一系列开源Java库和框架。
它包含了数十个组件,涉及了文件上传、线程池、日期转换、加密解密、JSON解析等方面。
使用场景:Apache Commons中的每个组件都有助于快速实现复杂的应用程序,针对每一种拓展都能够省去自己编写的时间和精力。
2. Apache POIApache POI是Apache组织推出的一个用于读写Excel的工具包。
POI是“Poor Obfuscation Implementation”的缩写,是一款很好的操作Excel 文件的开源类库。
使用场景:在Java应用程序中读取或者写入Excel文档或者其他Office 文档的时候,使用Apache POI是一个不错的选择。
3. Log4jLog4j是Apache组织提供的一种可扩展的日志系统。
可以对日志记录进行详细的控制,譬如记录级别、输出到文件或者控制台等。
使用场景:通过Log4j记录详细的日志,可在排查问题时帮助开发人员快速找到问题所在。
4. VelocityVelocity是一种模板引擎,它通过将动态内容组合到模板中来生成输出。
在开发Java应用程序时,使用Velocity能够轻松生成格式一致的输出。
使用场景:在Java程序中处理动态内容和输出时,使用Velocity是一个很不错的选择。
二、Spring工具包Spring是目前Java领域最流行的应用程序开发框架。
Java使用Poi-tlword模板导出word
Java使⽤Poi-tlword模板导出word 1.导⼊依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version></dependency>2.新建⼀个word,制作导出模板模板放⼊ resource/static/word/template⽂件夹下3.编写⼯具类⼯具类--WordExportServer.javapublic class WordExportServer {/*** 导出word**/public static void export(WordExportData wordExportData) throws IOException {HttpServletResponse response=wordExportData.getResponse();OutputStream out = response.getOutputStream();;XWPFTemplate template =null;try{ClassPathResource classPathResource = new ClassPathResource(wordExportData.getTemplateDocPath());String resource = classPathResource.getURL().getPath();resource= PdfUtil1.handleFontPath(resource);//渲染表格HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();Configure config = Configure.newBuilder().bind(wordExportData.getTableDataField(), policy).build();template = pile(resource, config).render(wordExportData.getWordData());String fileName=getFileName(wordExportData);/** ===============⽣成word到设置浏览默认下载地址=============== **/// 设置强制下载不打开response.setContentType("application/force-download");// 设置⽂件名response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);template.write(out);}catch (Exception e){e.printStackTrace();}finally {out.flush();out.close();template.close();}}/*** 获取导出下载的word名称* @param wordExportData* @return ng.String**/public static String getFileName(WordExportData wordExportData){if(null !=wordExportData.getFileName()){return wordExportData.getFileName()+".docx";}return System.currentTimeMillis()+".docx";}}word数据包装类--WordExportData .java@Datapublic class WordExportData {/*** word模板路径(static/wordTemplate/dealerListDocTemplate.docx)**/private String templateDocPath;/*** word填充数据(key值与模板中的key值要保持⼀致)**/private Map<String,Object> wordData;/*** word表格数据key值**/private String tableDataField;/*** word导出后的⽂件名(不填则⽤当前时间代替)**/private String fileName;private HttpServletResponse response;}4.controller层调⽤@RequestMapping("/printWord")public void printWord(HttpServletRequest request, HttpServletResponse response) throws IOException{String[] ids=request.getParameter("ids").split(";");List<DealerDto> goodsDataList=goodsService.getDealerListByIds(ids);Map<String,Object> docData=new HashMap<>(3);docData.put("detailList",goodsDataList);docData.put("title",标题);docData.put("subTitle",副标题);WordExportData wordExportData=new WordExportData();wordExportData.setResponse(response);wordExportData.setTableDataField("detailList");wordExportData.setTemplateDocPath(DEALER_DOC_TEMPLATE_PATH);//副本存放路径wordExportData.setWordData(docData);WordExportServer.export(wordExportData);}5.前端调⽤var ids = [];for (var index in checkData) {ids.push(checkData[index].id);}var batchIds = ids.join(";");layer.confirm('确定下载选中的数据吗?', function (index) {layer.close(index);window.location.href ='/goods/printWord?ids=' + batchIds;});6.总结优点:使⽤⽅法很简单,使⽤⼯具类的⽅法,⽅便复⽤于其他模块。
JavaPOI操作word文档内容、表格
JavaPOI操作word⽂档内容、表格⼀、pom<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.0.0</version></dependency>⼆、直接上代码word模板中${content} 注意我只有在.docx⽤XWPFDocument才有效2.1/*** 获取document**/XWPFDocument document = null;try {document = new XWPFDocument(inputStream);} catch (IOException ioException) {ioException.printStackTrace();}/*** 替换段落⾥⾯的变量** @param doc 要替换的⽂档* @param params 参数*/private void replaceInPara(XWPFDocument doc, Map<String, String> params) {for (XWPFParagraph para : doc.getParagraphs()) {replaceInPara(para, params);}}/*** 替换段落⾥⾯的变量** @param para 要替换的段落* @param params 参数*/private void replaceInPara(XWPFParagraph para, Map<String, String> params) {List<XWPFRun> runs;Matcher matcher;replaceText(para);//如果para拆分的不对,则⽤这个⽅法修改成正确的if (matcher(para.getParagraphText()).find()) {runs = para.getRuns();for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = run.toString();matcher = matcher(runText);if (matcher.find()) {while ((matcher = matcher(runText)).find()) {runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));}//直接调⽤XWPFRun的setText()⽅法设置⽂本时,在底层会重新创建⼀个XWPFRun,把⽂本附加在当前⽂本后⾯, para.removeRun(i);para.insertNewRun(i).setText(runText);}}}}/*** 替换⽂本内容* @param para* @return*/private List<XWPFRun> replaceText(XWPFParagraph para) {List<XWPFRun> runs = para.getRuns();String str = "";boolean flag = false;for (int i = 0; i < runs.size(); i++) {XWPFRun run = runs.get(i);String runText = run.toString();if (flag || runText.equals("${")) {str = str + runText;flag = true;para.removeRun(i);if (runText.equals("}")) {flag = false;para.insertNewRun(i).setText(str);str = "";}i--;}}return runs;}2.22.2.1XWPFTable table = document.getTableArray(0);//获取当前表格XWPFTableRow twoRow = table.getRow(2);//获取某⼀⾏XWPFTableRow nextRow = table.insertNewTableRow(3);//插⼊⼀⾏XWPFTableCell firstRowCellOne = firstRow.getCell(0);firstRowCellOne.removeParagraph(0);//删除默认段落,要不然表格内第⼀条为空⾏XWPFParagraph pIO2 =firstRowCellOne.addParagraph();XWPFRun rIO2 = pIO2.createRun();rIO2.setFontFamily("宋体");//字体rIO2.setFontSize(8);//字体⼤⼩rIO2.setBold(true);//是否加粗rIO2.setColor("FF0000");//字体颜⾊rIO2.setText("这是写⼊的内容");//rIO2.addBreak(BreakType.TEXT_WRAPPING);//软换⾏,亲测有效/*** 复制单元格和样式** @param targetRow 要复制的⾏* @param sourceRow 被复制的⾏*/public void createCellsAndCopyStyles(XWPFTableRow targetRow, XWPFTableRow sourceRow) {targetRow.getCtRow().setTrPr(sourceRow.getCtRow().getTrPr());List<XWPFTableCell> tableCells = sourceRow.getTableCells();if (CollectionUtils.isEmpty(tableCells)) {return;}for (XWPFTableCell sourceCell : tableCells) {XWPFTableCell newCell = targetRow.addNewTableCell();newCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());List sourceParagraphs = sourceCell.getParagraphs();if (CollectionUtils.isEmpty(sourceParagraphs)) {continue;}XWPFParagraph sourceParagraph = (XWPFParagraph) sourceParagraphs.get(0);List targetParagraphs = newCell.getParagraphs();if (CollectionUtils.isEmpty(targetParagraphs)) {XWPFParagraph p = newCell.addParagraph();p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());} else {XWPFParagraph p = (XWPFParagraph) targetParagraphs.get(0);p.getCTP().setPPr(sourceParagraph.getCTP().getPPr());XWPFRun run = p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0);if (sourceParagraph.getRuns().size() > 0) {run.setFontFamily(sourceParagraph.getRuns().get(0).getFontFamily());}}}}#### 2.2.3/*** 合并单元格** @param table 表格对象* @param beginRowIndex 开始⾏索引* @param endRowIndex 结束⾏索引* @param colIndex 合并列索引*/public void mergeCell(XWPFTable table, int beginRowIndex, int endRowIndex, int colIndex) { if (beginRowIndex == endRowIndex || beginRowIndex > endRowIndex) {return;}//合并⾏单元格的第⼀个单元格CTVMerge startMerge = CTVMerge.Factory.newInstance();startMerge.setVal(STMerge.RESTART);//合并⾏单元格的第⼀个单元格之后的单元格CTVMerge endMerge = CTVMerge.Factory.newInstance();endMerge.setVal(STMerge.CONTINUE);table.getRow(beginRowIndex).getCell(colIndex).getCTTc().getTcPr().setVMerge(startMerge); for (int i = beginRowIndex + 1; i <= endRowIndex; i++) {table.getRow(i).getCell(colIndex).getCTTc().getTcPr().setVMerge(endMerge);}}/*** insertRow 在word表格中指定位置插⼊⼀⾏,并将某⼀⾏的样式复制到新增⾏* @param copyrowIndex 需要复制的⾏位置* @param newrowIndex 需要新增⼀⾏的位置* */public static void insertRow(XWPFTable table, int copyrowIndex, int newrowIndex) {// 在表格中指定的位置新增⼀⾏XWPFTableRow targetRow = table.insertNewTableRow(newrowIndex);// 获取需要复制⾏对象XWPFTableRow copyRow = table.getRow(copyrowIndex);//复制⾏对象targetRow.getCtRow().setTrPr(copyRow.getCtRow().getTrPr());//或许需要复制的⾏的列List<XWPFTableCell> copyCells = copyRow.getTableCells();//复制列对象XWPFTableCell targetCell = null;for (int i = 0; i < copyCells.size(); i++) {XWPFTableCell copyCell = copyCells.get(i);targetCell = targetRow.addNewTableCell();targetCell.getCTTc().setTcPr(copyCell.getCTTc().getTcPr());if (copyCell.getParagraphs() != null && copyCell.getParagraphs().size() > 0) {targetCell.getParagraphs().get(0).getCTP().setPPr(copyCell.getParagraphs().get(0).getCTP().getPPr()); if (copyCell.getParagraphs().get(0).getRuns() != null&& copyCell.getParagraphs().get(0).getRuns().size() > 0) {XWPFRun cellR = targetCell.getParagraphs().get(0).createRun();cellR.setBold(copyCell.getParagraphs().get(0).getRuns().get(0).isBold());}}}}/*** 正则匹配字符串** @param str* @return*/private Matcher matcher(String str) {Pattern pattern = pile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);return matcher;}。
【POI】hutool万能工具的poi使用(Excel操作)
【POI】hutool万能⼯具的poi使⽤(Excel操作)POI技术(hutool⼯具的简单使⽤)POI: java技术,操作excel⽂档hutool-excel:常⽤poi功能,简化封装成⼯具类写出⽂档数据:(1)导出数据报表①获得能够向excel表格中输出信息对象[流]writer = ExcelUtil.getWriter("⽂件路径");注释:excel表格⽂件标准后缀:*.xls、*.xlsx② excel表格数据包含:表头:指明当前列数据的含义每⾏:多个单元格的数据;List<Object> | Map<字符串标题,Object>表格:多⾏数据。
List<Map<表头,Object数据>>③将数据写出到Excel⽂档:writer.write(list);④关闭流:writer.close();(2)向输出流中写⼊数据①创建⼀个写出的⼯具:ExcelWriter ew = ExcelUtil.getWriter();②将list多⾏数据集合写⼊:writer.write(list);③ flush,将数据写⼊到指定输出流中:writer.flush(outputStream);④关闭流:writer.close();(3)设置表格的sheet的名字writer.renameSheet("xxx")读⼊⽂档数据:①创建⼀个读⼊的⼯具:ExcelReader reader = ExcelUtil.getReader("⽂件路径");②读取⾥⾯的数据:List<Map<String,Object>> list = reader.readAll();③关闭流:reader.close();实例代码:导出:准备:导⼊POI的jar以及hutool的jar①⽅式⼀:(表格信息写到对应的⽂件路径)ExcelUtil.getWriter("⽂件路径"); //直接写到⽂件⾥②⽅式⼆:(表格信息写到特定的输出流⾥)List<Person> list = new ArrayList<Person>();persons.add(new Person("1001", "黄浩", 1, 18, "233456789", "郑州"));persons.add(new Person("1002", "杨宁", 1, 18, "233456789", "郑州"));persons.add(new Person("1003", "洪诗鹏", 1, 18, "233456789", "郑州"));// 重要将数据转化为hutool-excel,能够直接写出的数据结构:List<Map<String,Object>>// 创建⼀个存储多⾏数据的listList<Map<String, Object>> persons = new ArrayList<Map<String, Object>>();for (Person person : list) {// 每个person信息,代表⼀⾏数据:Map<String,person的属性>Map<String, Object> map = new LinkedHashMap<String, Object>();map.put("编号", person.getId());map.put("名字", person.getName());map.put("年龄", person.getAge());map.put("地址", person.getAddress());persons.add(map); // 将当前⾏的数据,加⼊persons}ExcelWriter writer = ExcelUtil.getWriter("D:/person.xlsx");// ①创建写出数据到⽂档中的⼯具writer.renameSheet("联系⼈信息表"); //设置sheet的名字writer.write(persons); // ②将数据写出到⽂档导出⼯具中writer.flush(输出流);//输出流:可以是⽂件输出流,也可以是控制器的响应流进⾏下载writer.close(); // ③关闭流导⼊:①创建⼀个读⼊的⼯具:ExcelReader reader = ExcelUtil.getReader("D:/person.xlsx");②读取⾥⾯的数据:List<Map<String, Object>> list = reader.readAll();③关闭流:reader.close();。
Java使用poi做加自定义注解实现对象与Excel相互转换
Java使⽤poi做加⾃定义注解实现对象与Excel相互转换引⼊依赖maven<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>Gradleimplementation group: 'org.apache.poi', name: 'poi', version: '3.17'代码展⽰1、⾃定义注解类@Retention(value = RetentionPolicy.RUNTIME)@Target(value = ElementType.FIELD)public @interface Excel {String name();//列的名字int width() default 6000;//列的宽度int index() default -1;//决定⽣成的顺序boolean isMust() default true; // 是否为必须值,默认是必须的}2、Java的Excel对象,只展现了field,get与set⽅法就忽略了public class GoodsExcelModel {@Excel(name = "ID_禁⽌改动", index = 0, width = 0)private Long picId;//picId@Excel(name = "产品ID_禁⽌改动", index = 1, width = 0)private Long productId;@Excel(name = "型号", index = 3)private String productName;//产品型号@Excel(name = "系列", index = 2)private String seriesName;//系列名字@Excel(name = "库存", index = 5)private Long quantity;@Excel(name = "属性值", index = 4)private String propValue;@Excel(name = "价格", index = 6)private Double price;@Excel(name = "商品编码", index = 7, isMust = false)private String outerId;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long dbId; // 数据库⾃增长idprivate Date createTime; // 记录创建时间}3、Excel表格与对象转换的⼯具类,使⽤时指定泛型参数和泛型的class即可public class ExcelUtil {private static final String GET = "get";private static final String SET = "set";private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);/*** 将对象转换成Excel** @param objList 需要转换的对象* @return 返回是poi中的对象*/public static HSSFWorkbook toExcel(List objList) {if (CollectionUtils.isEmpty(objList)) throw new NullPointerException("⽆效的数据");Class aClass = objList.get(0).getClass();Field[] fields = aClass.getDeclaredFields();HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet();for (int i = 0; i < objList.size(); i++) {HSSFRow row = sheet.createRow(i + 1);//要从第⼆⾏开始写HSSFRow topRow = null;if (i == 0) topRow = sheet.createRow(0);for (Field field : fields) {Excel excel = field.getAnnotation(Excel.class);//得到字段是否使⽤了Excel注解if (excel == null) continue;HSSFCell cell = row.createCell(excel.index());//设置当前值放到第⼏列String startName = field.getName().substring(0, 1);String endName = field.getName().substring(1, field.getName().length());String methodName = new StringBuffer(GET).append(startName.toUpperCase()).append(endName).toString();try {Method method = aClass.getMethod(methodName);//根据⽅法名获取⽅法,⽤于调⽤Object invoke = method.invoke(objList.get(i));if (invoke == null) continue;cell.setCellValue(invoke.toString());} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}if (topRow == null) continue;HSSFCell topRowCell = topRow.createCell(excel.index());topRowCell.setCellValue(());sheet.setColumnWidth(excel.index(), excel.width());}}return workbook;}/*** 将Excel⽂件转换为指定对象** @param file 传⼊的Excel* @param c 需要被指定的class* @return* @throws IOException* @throws IllegalAccessException* @throws InstantiationException*/public static <T> List<T> excelFileToObject(MultipartFile file, Class<T> c) throws IOException, IllegalAccessException, InstantiationException { //key为反射得到的下标,value为对于的set⽅法Map<Integer, String> methodMap = new HashMap<>();//保存第⼀列的值与对应的下标,⽤于验证⽤户是否删除了该列,key为下标,value为名字Map<Integer, String> startRowNameMap = new HashMap<>();//⽤来记录当前参数是否为必须的Map<Integer, Boolean> fieldIsMustMap = new HashMap<>();//得到所有的字段Field[] fields = c.getDeclaredFields();for (Field field : fields) {Excel excel = field.getAnnotation(Excel.class);if (excel == null) continue;String startName = field.getName().substring(0, 1);String endName = field.getName().substring(1, field.getName().length());String methodName = new StringBuffer(SET).append(startName.toUpperCase()).append(endName).toString();methodMap.put(excel.index(), methodName);startRowNameMap.put(excel.index(), ());fieldIsMustMap.put(excel.index(), excel.isMust());}String fileName = file.getOriginalFilename();Workbook wb = fileName.endsWith(".xlsx") ? new XSSFWorkbook(file.getInputStream()) : new HSSFWorkbook(file.getInputStream());Sheet sheet = wb.getSheetAt(0);Row sheetRow = sheet.getRow(0);for (Cell cell : sheetRow) {Integer columnIndex = cell.getColumnIndex();if (cell.getCellTypeEnum() != CellType.STRING) throw new ExcelException("excel校验失败, 请勿删除⽂件中第⼀⾏数据 ");String value = cell.getStringCellValue();String name = startRowNameMap.get(columnIndex);if (name == null) throw new ExcelException("excel校验失败,请勿移动⽂件中任何列的顺序");if (!name.equals(value)) throw new ExcelException("excel校验失败,【" + name + "】列被删除,请勿删除⽂件中任何列 ");}sheet.removeRow(sheetRow);//第⼀⾏是不需要被反射赋值的List<T> models = new ArrayList<>();for (Row row : sheet) {if (row == null || !checkRow(row)) continue;T obj = c.newInstance();//创建新的实例化对象Class excelModelClass = obj.getClass();startRowNameMap.entrySet().forEach(x -> {Integer index = x.getKey();Cell cell = row.getCell(index);String methodName = methodMap.get(index);if (StringUtils.isEmpty(methodName)) return;List<Method> methods = Lists.newArrayList(excelModelClass.getMethods()).stream().filter(m -> m.getName().startsWith(SET)).collect(Collectors.toList());String rowName = startRowNameMap.get(index);//列的名字for (Method method : methods) {if (!method.getName().startsWith(methodName)) continue;//检测value属性String value = valueCheck(cell, rowName, fieldIsMustMap.get(index));//开始进⾏调⽤⽅法反射赋值methodInvokeHandler(obj, method, value);}});models.add(obj);}return models;}/*** 检测当前需要赋值的value** @param cell 当前循环⾏中的列对象* @param rowName 列的名字{@link Excel}中的name* @param isMust 是否为必须的* @return 值*/private static String valueCheck(Cell cell, String rowName, Boolean isMust) {//有时候删除单个数据会造成cell为空,也可能是value为空if (cell == null && isMust) {throw new ExcelException("excel校验失败,【" + rowName + "】中的数据禁⽌单个删除");}if (cell == null) return null;cell.setCellType(CellType.STRING);String value = cell.getStringCellValue();if ((value == null || value.trim().isEmpty()) && isMust) {throw new ExcelException("excel校验失败,【" + rowName + "】中的数据禁⽌单个删除");}return value;}/*** 反射赋值的处理的⽅法** @param obj 循环创建的需要赋值的对象* @param method 当前对象期中⼀个set⽅法* @param value 要被赋值的内容*/private static void methodInvokeHandler(Object obj, Method method, String value) {Class<?> parameterType = method.getParameterTypes()[0];try {if (parameterType == null) {method.invoke(obj);return;}String name = parameterType.getName();if (name.equals(String.class.getName())) {method.invoke(obj, value);return;}if (name.equals(Long.class.getName())) {method.invoke(obj, Long.valueOf(value));return;}if (name.equals(Double.class.getName())) {method.invoke(obj, Double.valueOf(value));}} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}}private static boolean checkRow(Row row) {try {if (row == null) return false;short firstCellNum = row.getFirstCellNum();short lastCellNum = row.getLastCellNum();if (firstCellNum < 0 && lastCellNum < 0) return false;if (firstCellNum != 0) {for (short i = firstCellNum; i < lastCellNum; i++) { Cell cell = row.getCell(i);String cellValue = cell.getStringCellValue(); if (!StringUtils.isBlank(cellValue)) return true; }return false;}return true;} catch (Exception e) {return true;}}4、导出Excel与导⼊Excel的⽰例代码使⽤展⽰1、选择数据2、设置基本数据,然后导出表格3、导出表格效果,在图⽚中看到A和B列没有显⽰出来,这是因为我将其宽度配置为了04、将必须参数删除后上传测试,如下图中,商品编码我设置isMust为false所以删除数据就不会出现此问题。
Java操作word文档使用JACOB和POI操作word,Excel,PPT需要的jar包
Java操作word⽂档使⽤JACOB和POI操作word,Excel,PPT需要的jar包可参考⽂档:下载jar包如上是jacob-1.17-M2.jar对应的jar包和dll⽂件....但是我在maven仓库中并没有发现jacob-1.17版本的.所以如果使⽤maven项⽬的话推荐下载jacob-1.14版本的jar包和dll⽂件.使⽤⽅式:import java.io.File;import java.io.FileInputStream;import java.util.ArrayList;import java.util.Arrays;import com.jacob.activeX.ActiveXComponent;public class WriteDoc2 {public static void main(String[] args) {//在正式批量跑之前,做单个word⽂档的测试.WordUtils util = new WordUtils(true);util.openDocument("C:\\Users\\ABC\\Desktop\\test.docx");util.setSaveOnExit(true);util.insertText("xxx444dddd4x");util.saveAs("C:\\Users\\ABC\\Desktop\\test.docx");util.closeDocument();}}对应WordUtils.java⼯具类,我是使⽤的如下:import com.jacob.activeX.ActiveXComponent;import .Dispatch;import .Variant;public class WordUtils {// word运⾏程序对象private ActiveXComponent word;// 所有word⽂档集合private Dispatch documents;// word⽂档private Dispatch doc;// 选定的范围或插⼊点private Dispatch selection;// 保存退出private boolean saveOnExit;public WordUtils(boolean visible) {word = new ActiveXComponent("Word.Application");word.setProperty("Visible", new Variant(visible));documents = word.getProperty("Documents").toDispatch();}/*** 设置退出时参数** @param saveOnExit* boolean true-退出时保存⽂件,false-退出时不保存⽂件 */public void setSaveOnExit(boolean saveOnExit) {this.saveOnExit = saveOnExit;}/*** 创建⼀个新的word⽂档*/public void createNewDocument() {doc = Dispatch.call(documents, "Add").toDispatch();selection = Dispatch.get(word, "Selection").toDispatch();}/*** 打开⼀个已经存在的word⽂档** @param docPath*/public void openDocument(String docPath) {doc = Dispatch.call(documents, "Open", docPath).toDispatch();selection = Dispatch.get(word, "Selection").toDispatch();}/*** 打开⼀个有密码保护的word⽂档* @param docPath* @param password*/public void openDocument(String docPath, String password) {doc = Dispatch.call(documents, "Open", docPath).toDispatch();unProtect(password);selection = Dispatch.get(word, "Selection").toDispatch();}/*** 去掉密码保护* @param password*/public void unProtect(String password){try{String protectionType = Dispatch.get(doc, "ProtectionType").toString();if(!"-1".equals(protectionType)){Dispatch.call(doc, "Unprotect", password);}}catch(Exception e){e.printStackTrace();}}/*** 添加密码保护* @param password*/public void protect(String password){String protectionType = Dispatch.get(doc, "ProtectionType").toString();if("-1".equals(protectionType)){Dispatch.call(doc, "Protect",new Object[]{new Variant(3), new Variant(true), password});}}/*** 显⽰审阅的最终状态*/public void showFinalState(){Dispatch.call(doc, "AcceptAllRevisionsShown");}/*** 打印预览:*/public void printpreview() {Dispatch.call(doc, "PrintPreView");}/*** 打印*/public void print(){Dispatch.call(doc, "PrintOut");}public void print(String printerName) {word.setProperty("ActivePrinter", new Variant(printerName));print();}/*** 指定打印机名称和打印输出⼯作名称* @param printerName* @param outputName*/public void print(String printerName, String outputName){word.setProperty("ActivePrinter", new Variant(printerName));Dispatch.call(doc, "PrintOut", new Variant[]{new Variant(false), new Variant(false), new Variant(0), new Variant(outputName)}); }/*** 把选定的内容或插⼊点向上移动** @param pos*/public void moveUp(int pos) {move("MoveUp", pos);}/*** 把选定的内容或者插⼊点向下移动** @param pos*/public void moveDown(int pos) {move("MoveDown", pos);}/*** 把选定的内容或者插⼊点向左移动** @param pos*/public void moveLeft(int pos) {move("MoveLeft", pos);}/*** 把选定的内容或者插⼊点向右移动** @param pos*/public void moveRight(int pos) {move("MoveRight", pos);}/*** 把选定的内容或者插⼊点向右移动*/public void moveRight() {Dispatch.call(getSelection(), "MoveRight");}/*** 把选定的内容或者插⼊点向指定的⽅向移动* @param actionName* @param pos*/private void move(String actionName, int pos) {for (int i = 0; i < pos; i++)Dispatch.call(getSelection(), actionName);}/*** 把插⼊点移动到⽂件⾸位置*/public void moveStart(){Dispatch.call(getSelection(), "HomeKey", new Variant(6));}/*** 把插⼊点移动到⽂件末尾位置*/public void moveEnd(){Dispatch.call(getSelection(), "EndKey", new Variant(6));}/*** 插⼊换页符*/public void newPage(){Dispatch.call(getSelection(), "InsertBreak");}public void nextPage(){moveEnd();moveDown(1);}public int getPageCount(){Dispatch selection = Dispatch.get(word, "Selection").toDispatch();return Dispatch.call(selection,"information", new Variant(4)).getInt(); }/*** 获取当前的选定的内容或者插⼊点* @return当前的选定的内容或者插⼊点*/public Dispatch getSelection(){if (selection == null)selection = Dispatch.get(word, "Selection").toDispatch();return selection;}/*** 从选定内容或插⼊点开始查找⽂本* @param findText 要查找的⽂本* @return boolean true-查找到并选中该⽂本,false-未查找到⽂本*/public boolean find(String findText){if(findText == null || findText.equals("")){return false;}// 从selection所在位置开始查询Dispatch find = Dispatch.call(getSelection(), "Find").toDispatch();// 设置要查找的内容Dispatch.put(find, "Text", findText);// 向前查找Dispatch.put(find, "Forward", "True");// 设置格式Dispatch.put(find, "Format", "True");// ⼤⼩写匹配Dispatch.put(find, "MatchCase", "True");// 全字匹配Dispatch.put(find, "MatchWholeWord", "True");// 查找并选中return Dispatch.call(find, "Execute").getBoolean();}/*** 查找并替换⽂字* @param findText* @param newText* @return boolean true-查找到并替换该⽂本,false-未查找到⽂本*/public boolean replaceText(String findText, String newText){moveStart();if (!find(findText))return false;Dispatch.put(getSelection(), "Text", newText);return true;}/*** 进⼊页眉视图*/public void headerView(){//取得活动窗体对象Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();//取得活动窗格对象Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();//取得视窗对象Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();Dispatch.put(view, "SeekView", "9");}/*** 进⼊页脚视图*/public void footerView(){//取得活动窗体对象Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();//取得活动窗格对象Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();//取得视窗对象Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();Dispatch.put(view, "SeekView", "10");}/*** 进⼊普通视图*/public void pageView(){//取得活动窗体对象Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();//取得活动窗格对象Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();//取得视窗对象Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();Dispatch.put(view, "SeekView", new Variant(0));//普通视图}/*** 全局替换⽂本* @param findText* @param newText*/public void replaceAllText(String findText, String newText){int count = getPageCount();for(int i = 0; i < count; i++){headerView();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveEnd();}footerView();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}pageView();moveStart();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}nextPage();}}/*** 全局替换⽂本* @param findText* @param newText*/public void replaceAllText(String findText, String newText, String fontName, int size){ /****插⼊页眉页脚*****///取得活动窗体对象Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch();//取得活动窗格对象Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch();//取得视窗对象Dispatch view = Dispatch.get(ActivePane, "View").toDispatch();/****设置页眉*****/Dispatch.put(view, "SeekView", "9");while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}/****设置页脚*****/Dispatch.put(view, "SeekView", "10");while (find(findText)){Dispatch.put(getSelection(), "Text", newText);moveStart();}Dispatch.put(view, "SeekView", new Variant(0));//恢复视图moveStart();while (find(findText)){Dispatch.put(getSelection(), "Text", newText);putFontSize(getSelection(), fontName, size);moveStart();}}/*** 设置选中或当前插⼊点的字体* @param selection* @param fontName* @param size*/public void putFontSize(Dispatch selection, String fontName, int size){Dispatch font = Dispatch.get(selection, "Font").toDispatch();Dispatch.put(font, "Name", new Variant(fontName));Dispatch.put(font, "Size", new Variant(size));}/*** 在当前插⼊点插⼊字符串*/public void insertText(String text){Dispatch.put(getSelection(), "Text", text);}/*** 将指定的⽂本替换成图⽚* @param findText* @param imagePath* @return boolean true-查找到并替换该⽂本,false-未查找到⽂本*/public boolean replaceImage(String findText, String imagePath, int width, int height){moveStart();if (!find(findText))return false;Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));moveRight();return true;}/*** 全局将指定的⽂本替换成图⽚* @param findText* @param imagePath*/public void replaceAllImage(String findText, String imagePath, int width, int height){moveStart();while (find(findText)){Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));moveStart();}}/*** 在当前插⼊点中插⼊图⽚* @param imagePath*/public void insertImage(String imagePath, int width, int height){Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));moveRight();}/*** 在当前插⼊点中插⼊图⽚* @param imagePath*/public void insertImage(String imagePath){Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath);}/*** 获取书签的位置* @param bookmarkName* @return书签的位置*/public Dispatch getBookmark(String bookmarkName){try{Dispatch bookmark = Dispatch.call(this.doc, "Bookmarks", bookmarkName).toDispatch();return Dispatch.get(bookmark, "Range").toDispatch();}catch(Exception e){e.printStackTrace();}return null;}/*** 在指定的书签位置插⼊图⽚* @param bookmarkName* @param imagePath*/public void insertImageAtBookmark(String bookmarkName, String imagePath){Dispatch dispatch = getBookmark(bookmarkName);if(dispatch != null)Dispatch.call(Dispatch.get(dispatch, "InLineShapes").toDispatch(), "AddPicture", imagePath);}/*** 在指定的书签位置插⼊图⽚* @param bookmarkName* @param imagePath* @param width* @param height*/public void insertImageAtBookmark(String bookmarkName, String imagePath, int width, int height){Dispatch dispatch = getBookmark(bookmarkName);if(dispatch != null){Dispatch picture = Dispatch.call(Dispatch.get(dispatch, "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch();Dispatch.call(picture, "Select");Dispatch.put(picture, "Width", new Variant(width));Dispatch.put(picture, "Height", new Variant(height));}}/*** 在指定的书签位置插⼊⽂本* @param bookmarkName* @param text*/public void insertAtBookmark(String bookmarkName, String text){Dispatch dispatch = getBookmark(bookmarkName);if(dispatch != null)Dispatch.put(dispatch, "Text", text);}/*** ⽂档另存为* @param savePath*/public void saveAs(String savePath){Dispatch.call(doc, "SaveAs", savePath);}/*** ⽂档另存为PDF* <b><p>注意:此操作要求word是2007版本或以上版本且装有加载项:Microsoft Save as PDF 或 XPS</p></b>* @param savePath*/public void saveAsPdf(String savePath){Dispatch.call(doc, "SaveAs", new Variant(17));}/*** 保存⽂档* @param savePath*/public void save(String savePath){Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(),"FileSaveAs", savePath);}/*** 关闭word⽂档*/public void closeDocument(){if (doc != null) {Dispatch.call(doc, "Close", new Variant(saveOnExit));doc = null;}}public void exit(){word.invoke("Quit", new Variant[0]);}}具体WordUtils类的使⽤暂时没有看到更多的例⼦,上⾯的util的使⽤是⾃⼰摸索出来的,可能不是最优,最恰当的.//==================================================================================================使⽤Java⼯具POI操作MicroSoft Office套件Word,Excle和PPT使⽤Maven⼯程的话需要在Pom.xml⽂件中引⼊的jar包.⼀开始是想使⽤POI⼯具操作,但是从⽹上找来的代码始终报编译错误,代码中的⼀些类找不到,但是也明明已经引⼊了poi-3.x.jar包⽂件,更换了好⼏个poi版本的jar包仍是⼀样的效果.随后调查,到底需要哪些jar包.....结果如下:<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>2.3.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.8</version></dependency>所依赖的全部jar包的截图如果只引⼊⼀个poi-3.x.jar包是会报错的. POI具体操作Word,Excel,和PPT的代码,⾃⾏百度.只要jar包引⼊的正确,运⾏编译代码就没有问题.。
JAVA数组操作的常用工具类
JAVA数组操作的常用工具类在Java中,数组是一种包含固定数量元素的数据结构。
数组操作是在数组中执行各种任务的过程,并且在编程中经常遇到。
为了简化数组操作的过程,Java提供了许多常用的工具类来处理数组。
下面是Java数组操作的常用工具类。
1. Arrays类:Arrays类提供了许多静态方法来处理数组,其中一些常用的方法包括:- sort(:对数组进行排序。
- binarySearch(:在排序后的数组中查找指定元素的索引。
- toString(:将数组转换为字符串。
- equals(:比较两个数组是否相等。
- fill(:将数组的所有元素设置为指定值。
2. System类:System类提供了一些用于操作数组的静态方法,其中一些常用的方法包括:- arraycopy(:将一个数组的部分元素复制到另一个数组。
- identityHashCode(:获取数组的哈希码。
3. Collections类:Collections类是Java集合框架的一部分,但也可以用于处理数组。
其中一些常用的方法包括:- sort(:对数组进行排序。
- binarySearch(:在排序后的数组中查找指定元素的索引。
4. Arrays类与Collection接口转换:Arrays类和Collection接口之间提供了一些静态方法,可以将数组转换为Collection,并将Collection转换为数组。
其中一些常用的方法包括:- asList(:将数组转换为List。
- toArray(:将Collection转换为数组。
- toList(:将Collection转换为List。
5. Arrays类与Stream接口转换:Java 8引入了Stream接口,可以对数组进行处理。
Arrays类提供了一些方法来将数组转换为Stream,并从Stream转换为数组。
其中一些常用的方法包括:- stream(:将数组转换为Stream。
java_POI教程
POI报表第一章POI简介--Jakata Poi HSSF:纯java的Excel解决方案在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。
在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。
或者是:我们已经习惯用Excel打印。
Apache的Jakata项目的POI子项目,目前比较成熟的是HSSF接口,处理MSExcel对象。
它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel 对象,你可以控制一些属性如sheet,cell等等。
首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。
POI可以到下载到。
实际运行时,需要有poi包就可以了。
HSSF提供给用户使用的对象在ermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。
有以下几种对象:HSSFWorkbook excel的文档对象HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFDataFormat 日期格式在poi1.7中才有以下2项:HSSFHeader sheet头HSSFFooter sheet尾(只有打印的时候才能看到效果)和这个样式HSSFCellStyle cell样式辅助操作包括HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表以下可能需要使用到如下的类import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFDataFormat;import ermodel.HSSFFont;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor;先看poi的examples包中提供的最简单的例子,建立一个空xls文件。
【JAVA】POI生成EXCEL图表(柱状图、折线等)
【JAVA】POI⽣成EXCEL图表(柱状图、折线等)1、使⽤excel⼯具⾃带的图形⼯具创建⼀个图:2、绑定数据区域:3、数据区域绑定完成,我们要做的就是将数据写⼊到数据区域中:4、标记5、POI 引⼊包<!-- https:///artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version></dependency><!-- https:///artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>6、代码:FileInputStream is = new FileInputStream("刚才创建的⽂件所在⽬录+⽂件名");XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);FileOutputStream os = new FileOutputStream("导出的位置");//获取创建⼯作簿的第⼀页XSSFSheet sheet = xssfWorkbook.getSheetAt(0);//⾃动计算sheet.setForceFormulaRecalculation(true);//给指定的sheet命名xssfWorkbook.setSheetName(0, "sheet0");//初始化当前的索引,设为当前sheet的最后⼀⾏⾏数int allRows = sheet.getLastRowNum();//存储当前表格的样式XSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();//填充数据for(int i=allRows;i<=allRows;i++){XSSFRow row = sheet.getRow(i);if (row == null) {continue;}//遍历列for (int j = 1; j <=dailyReportPart8.size(); j++) {XSSFCell cell = row.getCell(j) != null ? row.getCell(j) : row.createCell(j); String cellValue = cell.getStringCellValue();if (cellValue.startsWith("#a1")) {cell.setCellValue(1);}}}//写出xssfWorkbook.write(os);//TODO 流的处理is.close();os.flush();os.close();。
【原创】POI操作Excel导入导出工具类ExcelUtil
【原创】POI操作Excel导⼊导出⼯具类ExcelUtil关于本类线程安全性的解释:多数⼯具⽅法不涉及共享变量问题,⾄于添加合并单元格⽅法addMergeArea,使⽤ThreadLocal变量存储合并数据,ThreadLocal内部借⽤Thread.ThreadLocalMap以当前ThreadLocal为key进⾏存储,设置⼀次变量,则其他线程也会有上次数据的残留,因此在addMergeArea⽅法中进⾏清空的操作。
为了保证原⼦性, 采⽤ReentrantLock确保⼀次只有⼀个线程可以进⾏添加合并数据的操作。
线程安全性从以上两个⽅⾯保证。
⽔平有限,难免会有疏漏,敬请谅解。
主要使⽤Apache POI进⾏Excel的导⼊、导出使⽤读取Excel中的数据原始数据如下:⽅法:public static List<List<String>> readFile(InputStream ins, int headRowNum) throws Exception使⽤⽅式:String filePath = "excel⽂件路径";File file = new File(filePath);InputStream ins = new FileInputStream(file);List<List<String>> lists = ExcelUtil.readFile(ins, 2);System.out.println(lists);返回结果:[[序号, 部门, 姓名, 上岗证号, 岗职, ⼊职时间], [, , , , , ], [1, 财务部, 赵六, 001, 出纳, 1540915200000], [1, 财务部, 张三, 002, 会计, 1517328000000]]注:对于Date类型,读取时读的是long类型参数将Excel中的数据转换为对应的实体Entitypublic static <T> List<T> getListFromExcel(InputStream ins, int headRowNum, Class<T> cls, int parseIndex, String... excludeAttr) throws Exceptionpublic static <T> List<T> getListFromExcel(MultipartFile file, int headRowNum, Class<T> cls, int parseIndex, String... excludeAttr) throws Exception两种⽅法本质上没有什么区别,可变参数excludeAttr配置实体不匹配的属性,例如:id注:转换的时候,需要保证excel中属性的顺序与实体中属性的顺序对应,例如excel中部门-姓名-上岗证号...这样,则实体也应该按照这样的顺序定义属性。
poi常用方法
poi常用方法Poi是指POI(Poor Obfuscation Implementation),是一份Apache下开源的Java组件,主要用于操作Excel格式的文档。
Poi功能丰富,应用广泛,下面将围绕poi常用方法给大家做一篇介绍。
1.导入poi包在项目工程中,我们需要在pom.xml中引用poi相关的jar包,也可以在项目java源码中手动引用。
如果不想下载poi组件,也可以根据maven的配置文件向maven中心仓库请求自动下载。
2.创建工作簿使用poi操作Excel文档,第一步需要创建一个工作簿对象。
我们可以通过创建一个HSSFWorkbook对象或XSSFWorkbook对象来实现。
```HSSFWorkbook wb = new HSSFWorkbook();//创建xls文件XSSFWorkbook wb = new XSSFWorkbook();//创建xlsx文件```3.创建工作表Excel文档通常是由多个工作表组成,我们通过POI也可以创建工作表。
在创建工作簿之后,同样可以创建一个或多个工作表。
```HSSFSheet sheet = wb.createSheet();//创建xls工作表XSSFSheet sheet = wb.createSheet();//创建xlsx工作表```4.创建单元格Excel文档中常常有很多单元格,每个单元格都有固定的行和列。
POI也可以创建或修改单元格。
```HSSFRow row = sheet.createRow(0);//创建第一行HSSFCell cell = row.createCell(0);//创建第一列第一个单元格cell.setCellValue("这是一个单元格的值");//设置单元格的值```5.读取单元格我们可以使用POI来读取Excel文档中的单元格。
使用一个HSSFCell 对象可以读取一行数据的值。
Java中使用poi导出复合表头(合并表头)
Java中使⽤poi导出复合表头(合并表头)1、导出⽰例2、需要导⼊的包 poi 坐标<!--核⼼jar包--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><!--⽀持xlsx读取--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency>3、代码package mon.util;import mons.fileupload.disk.DiskFileItem;import mons.fileupload.disk.DiskFileItemFactory;import ng3.time.DateFormatUtils;import ermodel.*;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.ss.util.RegionUtil;import ermodel.XSSFClientAnchor;import ermodel.XSSFWorkbook;import org.apache.tomcat.util.http.fileupload.IOUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.multipart.MultipartFile;import monsMultipartFile;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import .URLEncoder;import java.time.LocalDateTime;import java.time.format.DateTimeFormatter;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;/*** ⽀持复合表头导出的Excel⼯具类** @author liukun* @version 1.0* @date 2020/2/18 20:22*/public class ExcelUtils {private ExcelUtils() {throw new UnsupportedOperationException("initialization is prohibited...");}private static Logger logger = LoggerFactory.getLogger(ExcelUtils.class);/*** 图⽚*/public static class Image {private byte[] imageData;public Image(byte[] imageData) {this.imageData = imageData;}public byte[] getImageData() {return imageData;}}/*** 导出(⽬前仅⽀持⼩于两⾏表头的合并操作)* @param realName 导出⽂件名* @param data 导出数据* @param fields 导出字段,⽐如 date|时间,firstHeader|表头1,secondHeader|表头2,sub001|编号-0001|⼦标题1,sub002|编号-0001|⼦标题2,sub003|编号-0001|⼦标题3,sub004|编号-0001|⼦标题4,remark|备注 */public static void export(HttpServletResponse response, String realName, List<Map<String, Object>> data, String fields) {String fileName = realName + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + ".xlsx";writeFileToResponse(construct(fields, data, fileName), response);}/*** 导出并转换时间格式(⽬前仅⽀持⼩于两⾏表头的合并操作)* @param realName 导出⽂件名* @param data 导出数据* @param fields 导出字段,⽐如 date|时间,firstHeader|表头1,secondHeader|表头2,sub001|编号-0001|⼦标题1,sub002|编号-0001|⼦标题2,sub003|编号-0001|⼦标题3,sub004|编号-0001|⼦标题4,remark|备注 * @param formatter ⽇期格式化字符串*/public static void export(HttpServletResponse response, String realName, List<Map<String, Object>> data, String fields, String formatter) {convertDateToStr(data, formatter);export(response, realName, data, fields);}/*** 将⽂件写⼊响应流* @param file ⽂件* @param response 响应* @throws UnsupportedEncodingException*/public static void writeFileToResponse(MultipartFile file, HttpServletResponse response) {// 设置⽂件ContentType类型,这样设置,会⾃动判断下载⽂件类型response.setContentType("multipart/form-data");InputStream inputStream = null;try {String fileName = URLEncoder.encode(((CommonsMultipartFile) file).getFileItem().getName(), "UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");response.setHeader("Pragma", "public");response.setDateHeader("Expires", (System.currentTimeMillis() + 1000));inputStream = file.getInputStream();OutputStream out = response.getOutputStream();byte[] buffer = new byte[1024];int count = 0;while ((count = inputStream.read(buffer)) != -1) {out.write(buffer, 0, count);}out.close();out.flush();} catch (IOException e) {logger.error("⽂件下载异常:⽂件名【%s】", file.getName(), e);} finally {IOUtils.closeQuietly(inputStream);}}/*** 创建⽣成 excel ⽂档* @param fields 导出字段* @param data 导出数据* @param fileName 导出⽂档名称* @return⽣成的 excel ⽂档*/private static MultipartFile construct(String fields, List<Map<String, Object>> data, String fileName) {Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet();CellStyle cellStyle = createCellStyle(workbook);Map<String, Integer> fieldOrder = getFieldOrder(fields);// 头部占的⾏数int headerRows = calculateHeaderRows(fields);initHeader(sheet, cellStyle, fields, headerRows);fillData(workbook, sheet, cellStyle, data, fieldOrder, headerRows);DiskFileItem fileItem = (DiskFileItem)(new DiskFileItemFactory()).createItem("file", "text/plain", true, fileName);try {OutputStream os = fileItem.getOutputStream();Throwable var8 = null;try {workbook.write(os);} catch (Throwable var18) {var8 = var18;throw var18;} finally {if (os != null) {if (var8 != null) {try {os.close();} catch (Throwable var17) {var8.addSuppressed(var17);}} else {os.close();}}}} catch (Exception var20) {throw new IllegalArgumentException("Invalid file: " + var20, var20);}return new CommonsMultipartFile(fileItem);}/*** 初始化表头* @param sheet sheet页* @param cellStyle 单元格样式* @param fields 导出字段* @param headerRows 头部所占的⾏数*/private static void initHeader(Sheet sheet, CellStyle cellStyle, String fields, int headerRows) { // 构造表头Row row1 = sheet.createRow(0);Row row2 = null;if (headerRows > 1) {row2 = sheet.createRow(1);}String[] field = fields.split(",");// 上⼀个合并的表头名称String preMergeName = null;// 合并的起⽌索引int startIdx = 0,endIdx = -1;for (int i = 0; i < field.length; i++) {String[] f = field[i].split("\\|");Cell c1 = row1.createCell(i);c1.setCellStyle(cellStyle);c1.setCellValue(f[1]);if (f.length > 2) {Cell c2 = row2.createCell(i);c2.setCellStyle(cellStyle);c2.setCellValue(f[f.length - 1]);if (preMergeName == null) {preMergeName = f[1];startIdx = i;endIdx = startIdx;} else if (preMergeName.equals(f[1])){endIdx++;} else {mergeRegion(sheet, 0, 0, startIdx, endIdx);preMergeName = f[1];startIdx = i;endIdx = startIdx;}} else {if (headerRows > 1) {mergeRegion(sheet, 0, 1, i, i);}if (preMergeName != null) {mergeRegion(sheet, 0, 0, startIdx, endIdx);preMergeName = null;}}// 处理最后⼀次循环if (i == field.length -1) {if (preMergeName != null) {mergeRegion(sheet, 0, 0, startIdx, endIdx);}}}}/*** 计算表头需要占⽤的⾏数* @param fields 导出字段* @return表头需要占⽤的⾏数*/private static int calculateHeaderRows(String fields) {int rowMax = 0;int rowCount = 0;char[] chars = fields.toCharArray();for (char c : chars) {if (c == '|') {rowCount ++;} else if (c == ',') {if (rowCount > rowMax) {rowMax = rowCount;}rowCount = 0;}}return rowMax;}/*** 填充数据* @param workbook workbook⽂档* @param sheet sheet页* @param cellStyle 单元格样式* @param data 待填充的数据* @param fieldOrder 字段填充顺序* @param headerRows 头部占的⾏数*/private static void fillData(Workbook workbook, Sheet sheet, CellStyle cellStyle, List<Map<String, Object>> data, Map<String, Integer> fieldOrder, int headerRows) { for (int i = 0; i < data.size(); i++) {Row row = sheet.createRow(headerRows + i);data.get(i).forEach((key, value) -> {// 为了保证只导出 fields 中的字段,这⾥必须加这个判断if (fieldOrder.get(key) != null) {Cell cell = row.createCell(fieldOrder.get(key));cell.setCellStyle(cellStyle);if (value != null) {if (value instanceof Image) {setCellPicture(workbook, sheet, cell, (Image) value);} else {cell.setCellValue(String.valueOf(value));}} else {cell.setCellValue("");}}});}}/*** 设置单元格图⽚(图⽚是悬浮的)* @param workbook workbook⽂档* @param sheet sheet页* @param cell 单元格* @param image 图⽚*/private static void setCellPicture(Workbook workbook, Sheet sheet, Cell cell, Image image) {int rowIndex = cell.getRowIndex();int columnIndex = cell.getColumnIndex();// 绘图对象Drawing<?> patriarch = sheet.createDrawingPatriarch();// 创建锚点XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, columnIndex, rowIndex, columnIndex + 1, rowIndex + 1);patriarch.createPicture(anchor, workbook.addPicture(image.getImageData(), XSSFWorkbook.PICTURE_TYPE_JPEG));}/*** 得到字段的⾏索引* @param fields 字段* @return字段索引map*/private static Map<String, Integer> getFieldOrder(String fields) {Map<String, Integer> fieldOrder = new HashMap<>(16);String[] field = fields.split(",");for (int i = 0; i < field.length; ++i) {String[] f = field[i].split("\\|");fieldOrder.put(f[0], i);}return fieldOrder;}/*** 创建⾃定义单元格样式* @param workbook ⼯作簿*/private static CellStyle createCellStyle(Workbook workbook) {// 为单元格设置边框线CellStyle cellStyle = workbook.createCellStyle();cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderRight(BorderStyle.THIN);// 居中显⽰cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);return cellStyle;}/*** 合并区域* @param sheet sheet页* @param firstRow 起始⾏* @param lastRow 结束⾏* @param firstCol 起始列* @param lastCol 结束列*/private static void mergeRegion(Sheet sheet,int firstRow, int lastRow, int firstCol, int lastCol) {if (firstRow == lastRow && firstCol == lastCol) {return;}CellRangeAddress cra = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);sheet.addMergedRegion(cra);// 为合并后的单元格添加边框线RegionUtil.setBorderTop(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderLeft(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheet);}/*** 转换时间格式* @param data 导出数据* @param formatter 转换格式 formatter*/private static void convertDateToStr(List<Map<String, Object>> data, String formatter) {for (Map<String, Object> datum : data) {for (Map.Entry<String, Object> stringObjectEntry : datum.entrySet()) {String key = stringObjectEntry.getKey();Object value = stringObjectEntry.getValue();if (value != null) {if (value instanceof Date) {datum.put(key, DateFormatUtils.format((Date) value, formatter));} else if (value instanceof LocalDateTime) {datum.put(key, ((LocalDateTime) value).format(DateTimeFormatter.ofPattern(formatter)));}}}}}}View Code4、使⽤⽰例@GetMapping("export-test")public void exportTest(HttpServletResponse response) {List<Map<String, Object>> mapList = new ArrayList<>();// ... 这⾥忽略了得到数据的过程String exportFields = "date|时间,firstHeader|表头1,secondHeader|表头2," +"sub001|编号-0001|⼦标题1,sub002|编号-0001|⼦标题2,sub003|编号-0001|⼦标题3,sub004|编号-0001|⼦标题4,remark|备注"; ExcelUtils.export(response, "导出的⽂件名", mapList, exportFields, "yyyy-MM-dd HH:mm");}5、导出图⽚的⽰例@GetMapping("/export")public void export(HttpServletResponse response) throws IOException {ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();File file = new File("E:\\桌⾯壁纸\\yoona1.jpg");BufferedImage bufferImg = ImageIO.read(file);ImageIO.write(bufferImg, file.getName().substring(file.getName().lastIndexOf(".") + 1), byteArrayOut);// 得到数据List<SysUser> list = sysUserService.list(Wrappers.<SysUser>lambdaQuery().isNotNull(SysUser::getCreatedTime));List<Map<String, Object>> mapList = BeanUtils.beansToMaps(list, SysUser.class);// 导出的字段String exportFields = "name|姓名,loginName|登录名,password|密码,pic|图⽚";// 往导出的数据中加⼊图⽚mapList.get(0).put("pic", new ExcelUtils.Image(byteArrayOut.toByteArray()));mapList.get(1).put("pic", null);ExcelUtils.export(response, "测试", mapList, exportFields);byteArrayOut.close();}导出截图:。
java poi 合并单元格工具类
java poi 合并单元格工具类Java POI是一个用于操作Microsoft Office文档的Java类库。
在Excel文件中,单元格的合并是一项常用的操作。
合并单元格是将多个单元格合并成一个更大的单元格,以便统一处理数据或美化表格样式。
在本文中,我将介绍一个用于合并单元格的Java POI工具类。
第一步,我们需要创建一个名为MergeUtil的Java类。
在这个类中,我们将定义一些静态方法,用于合并单元格的操作。
javaimport ermodel.CellRangeAddress;import ermodel.Sheet;import ermodel.Workbook;public class MergeUtil {合并单元格的方法public static void mergeCells(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {CellRangeAddress region = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);sheet.addMergedRegion(region);}}在这个工具类中,我们使用了Apache POI Java类库中的`Sheet`和`CellRangeAddress`类来完成单元格的合并操作。
`Sheet`类代表Excel中的一个工作表,`CellRangeAddress`类代表一个单元格区域。
`mergeCells`方法接受一个`Sheet`对象和四个整数参数,分别表示需要合并的区域的首行、末行、首列和末列。
该方法将创建一个`CellRangeAddress`对象,并将其添加到工作表的合并区域中。
下面,我们将演示如何使用这个工具类来合并单元格。
javaimport ermodel.*;import ermodel.XSSFWorkbook;import java.io.FileOutputStream;import java.io.IOException;public class Main {public static void main(String[] args) {Workbook workbook = new XSSFWorkbook();Sheet sheet = workbook.createSheet("Sheet1");合并单元格前的数据for (int row = 0; row < 5; row++) {Row sheetRow = sheet.createRow(row);for (int col = 0; col < 5; col++) {Cell cell = sheetRow.createCell(col);cell.setCellValue("Data " + (row + 1) + "-" + (col + 1));}}合并单元格MergeUtil.mergeCells(sheet, 1, 3, 1, 3);保存Excel文件try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) {workbook.write(outputStream);System.out.println("Excel文件已创建成功。
java使用poi转换docdocx为pdf
java使⽤poi转换docdocx为pdf为了⽅便前端预览word⽂件,上传后进⾏pdf转换(也可以预览时⽣成临时⽂件)*注word中插⼊的表格的话表格内字体都要为宋体不然转出来为空引⽤jar包<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId> <version>2.0.1</version> </dependency><!-- https:///artifact/org.apache.poi/poi-scratchpad --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency>docx转换⽐较简单代码如下FileInputStream fileInputStream = null;FileOutputStream fileOutputStream=null;try {// 读取docx⽂件fileInputStream = new FileInputStream(inPath);XWPFDocument xwpfDocument = new XWPFDocument(fileInputStream);PdfOptions pdfOptions = PdfOptions.create();// 输出路径fileOutputStream = new FileOutputStream(outPath);// 调⽤转换PdfConverter.getInstance().convert(xwpfDocument,fileOutputStream,pdfOptions);} catch (IOException e) {e.printStackTrace();}finally {fileInputStream.close();fileOutputStream.close();}doc不能直接通过poi转换pdf,看到有教程先转html然后再转pdf,要结合itext还要处理html标签闭合问题觉得太⿇烦(好吧其实是我懒).转换思路找到⼀个jar包可以把doc转成docx :spire.doc.free-3.9.0.jar⽹址:https:///Introduce/Free-Spire-Doc-JAVA.html 下载后引⼊或安装到本地maven仓库添加pom即可官⽅有提⽰:免费版有篇幅限制。
java通过POI和easypoi实现Excel的导出
java通过POI和easypoi实现Excel的导出前⾔在⼯作经常会遇到excel导出报表的功能,⾃⼰也做过⼀些,然后在项⽬⾥看到同事封装的⼀个excel导出⼯具类,着实不错,拿来分享⼀下。
然后,⼜在⽹上看到⼀个使⽤easypoi实现cxcel导出的博客,于是⾃⼰也仿着搞了⼀下,在这也分享⼀下。
使⽤POI实现excel导出⾸先,引⼊jar包,这是POI需要的jar包。
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency>下⾯是主要的实现⽅法。
定义⼀个函数式接⼝,⽤于⾃定义格式。
package com.mz.util;import java.io.IOException;/*** @version V1.0* @Description:* @date 2018/10/31 17:16*/@FunctionalInterfacepublic interface ExportConsumer<ByteArrayOutputStream, Workbook, List> {/***⾃定义导出数据拼装* @param fileOut 输出流* @param wb workbook对象* @param listData 数据集* @throws IOException*/void accept(ByteArrayOutputStream fileOut, Workbook wb, List listData) throws IOException;}⼯具类主要⽅法package com.mz.util;import ermodel.Workbook;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.MediaType;import org.springframework.http.ResponseEntity;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.nio.charset.StandardCharsets;import java.util.List;public class POIExportUtil {/*** 导出excel** @param fileOut 输出流* @param wb excel workbook对象* @param listData 需要导出的数据* @param consumer ⾃定义导出excel的格式* @param fileName ⽂件名* @return ResponseEntity* @throws IOException*/public static <T> ResponseEntity<byte[]> exportExcel(ByteArrayOutputStream fileOut,Workbook wb,List<T> listData,String fileName,ExportConsumer<ByteArrayOutputStream, Workbook, List<T>> consumer) throws IOException {consumer.accept(fileOut, wb, listData);HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setContentDispositionFormData("attachment", new String((fileName + ".xls").getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));return new ResponseEntity<>(fileOut.toByteArray(), headers, HttpStatus.OK);}}使⽤案例,页⾯通过<a>标签访即可。
POI通用导出Excel(.xls,.xlsx)的方法
POI通⽤导出Excel(.xls,.xlsx)的⽅法POI操作EXCEL对象HSSF:操作Excel 97(.xls)格式XSSF:操作Excel 2007 OOXML (.xlsx)格式,操作EXCEL内存占⽤⾼于HSSFSXSSF:从POI3.8 beta3开始⽀持,基于XSSF,低内存占⽤。
使⽤POI的HSSF对象,⽣成Excel 97(.xls)格式,⽣成的EXCEL不经过压缩直接导出。
线上问题:负载服务器转发请求到应⽤服务器阻塞,以及内存溢出。
如果系统存在⼤数据量报表导出,则考虑使⽤POI的SXSSF进⾏EXCEL操作。
HSSF⽣成的Excel 97(.xls)格式本⾝就有每个sheet页不能超过65536条的限制。
XSSF⽣成Excel 2007 OOXML (.xlsx)格式,条数增加了,但是导出过程中,内存占⽤率却⾼于HSSF.SXSSF是⾃3.8-beta3版本后,基于XSSF提供的低内存占⽤的操作EXCEL对象。
其原理是可以设置或者⼿动将内存中的EXCEL⾏写到硬盘中,这样内存中只保存了少量的EXCEL⾏进⾏操作。
EXCEL的压缩率特别⾼,能达到80%,12M的⽂件压缩后才2M左右。
如果未经过压缩、不仅会占⽤⽤户带宽,且会导致负载服务器(apache)和应⽤服务器之间,长时间占⽤连接(⼆进制流转发),导致负载服务器请求阻塞,不能提供服务。
⼀定要注意⽂件流的关闭防⽌前台(页⾯)连续触发导出EXCEL1.通⽤核⼼导出⼯具类 ExcelUtil.javapackage sy.util;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import ng.reflect.Method;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import org.apache.poi.hpsf.SummaryInformation;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFClientAnchor;import ermodel.HSSFComment;import ermodel.HSSFFont;import ermodel.HSSFPatriarch;import ermodel.HSSFRichTextString;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.ss.formula.functions.T;import ermodel.CellStyle;import ermodel.DateUtil;import ermodel.Font;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.streaming.SXSSFCell;import org.apache.poi.xssf.streaming.SXSSFRow;import org.apache.poi.xssf.streaming.SXSSFSheet;import org.apache.poi.xssf.streaming.SXSSFWorkbook;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;public class ExcelUtil{public static String NO_DEFINE = "no_define";//未定义的字段public static String DEFAULT_DATE_PATTERN="yyyy年MM⽉dd⽇";//默认⽇期格式public static int DEFAULT_COLOUMN_WIDTH = 17;/*** 导出Excel 97(.xls)格式,少量数据* @param title 标题⾏* @param headMap 属性-列名* @param jsonArray 数据集* @param datePattern ⽇期格式,null则⽤默认⽇期格式* @param colWidth 列宽默认⾄少17个字节* @param out 输出流*/public static void exportExcel(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) { if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;// 声明⼀个⼯作薄HSSFWorkbook workbook = new HSSFWorkbook();workbook.createInformationProperties();workbook.getDocumentSummaryInformation().setCompany("*****公司");SummaryInformation si = workbook.getSummaryInformation();si.setAuthor("JACK"); //填加xls⽂件作者信息si.setApplicationName("导出程序"); //填加xls⽂件创建程序信息si.setLastAuthor("最后保存者信息"); //填加xls⽂件最后保存者信息si.setComments("JACK is a programmer!"); //填加xls⽂件作者信息si.setTitle("POI导出Excel"); //填加xls⽂件标题信息si.setSubject("POI导出Excel");//填加⽂件主题信息si.setCreateDateTime(new Date());//表头样式HSSFCellStyle titleStyle = workbook.createCellStyle();titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);HSSFFont titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 20);titleFont.setBoldweight((short) 700);titleStyle.setFont(titleFont);// 列头样式HSSFCellStyle headerStyle = workbook.createCellStyle();headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);HSSFFont headerFont = workbook.createFont();headerFont.setFontHeightInPoints((short) 12);headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerStyle.setFont(headerFont);// 单元格样式HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);HSSFFont cellFont = workbook.createFont();cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);cellStyle.setFont(cellFont);// ⽣成⼀个(带标题)表格HSSFSheet sheet = workbook.createSheet();// 声明⼀个画图的顶级管理器HSSFPatriarch patriarch = sheet.createDrawingPatriarch();// 定义注释的⼤⼩和位置,详见⽂档HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,0, 0, 0, (short) 4, 2, (short) 6, 5));// 设置注释内容comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));// 设置注释作者,当⿏标移动到单元格上是可以在状态栏中看到该内容.comment.setAuthor("JACK");//设置列宽int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//⾄少字节数int[] arrColWidth = new int[headMap.size()];// 产⽣表格标题⾏,以及设置列宽String[] properties = new String[headMap.size()];String[] headers = new String[headMap.size()];int ii = 0;for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {String fieldName = iter.next();properties[ii] = fieldName;headers[ii] = fieldName;int bytes = fieldName.getBytes().length;arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;sheet.setColumnWidth(ii,arrColWidth[ii]*256);ii++;}// 遍历集合数据,产⽣数据⾏int rowIndex = 0;for (Object obj : jsonArray) {if(rowIndex == 65535 || rowIndex == 0){if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第⼆页显⽰HSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0titleRow.createCell(0).setCellValue(title);titleRow.getCell(0).setCellStyle(titleStyle);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));HSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1for(int i=0;i<headers.length;i++){headerRow.createCell(i).setCellValue(headers[i]);headerRow.getCell(i).setCellStyle(headerStyle);}rowIndex = 2;//数据内容从 rowIndex=2开始}JSONObject jo = (JSONObject) JSONObject.toJSON(obj);HSSFRow dataRow = sheet.createRow(rowIndex);for (int i = 0; i < properties.length; i++){HSSFCell newCell = dataRow.createCell(i);Object o = jo.get(properties[i]);String cellValue = "";if(o==null) cellValue = "";else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);else cellValue = o.toString();newCell.setCellValue(cellValue);newCell.setCellStyle(cellStyle);}rowIndex++;}// ⾃动调整宽度/*for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}*/try {workbook.write(out);workbook.close();} catch (IOException e) {e.printStackTrace();}}/*** 导出Excel 2007 OOXML (.xlsx)格式* @param title 标题⾏* @param headMap 属性-列头* @param jsonArray 数据集* @param datePattern ⽇期格式,传null值则默认年⽉⽇* @param colWidth 列宽默认⾄少17个字节* @param out 输出流*/public static void exportExcelX(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) { if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;// 声明⼀个⼯作薄SXSSFWorkbook workbook = new SXSSFWorkbook(1000);//缓存workbook.setCompressTempFiles(true);//表头样式CellStyle titleStyle = workbook.createCellStyle();titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);Font titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 20);titleFont.setBoldweight((short) 700);titleStyle.setFont(titleFont);// 列头样式CellStyle headerStyle = workbook.createCellStyle();headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);Font headerFont = workbook.createFont();headerFont.setFontHeightInPoints((short) 12);headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerStyle.setFont(headerFont);// 单元格样式CellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);Font cellFont = workbook.createFont();cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);cellStyle.setFont(cellFont);// ⽣成⼀个(带标题)表格SXSSFSheet sheet = workbook.createSheet();//设置列宽int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//⾄少字节数 int[] arrColWidth = new int[headMap.size()];// 产⽣表格标题⾏,以及设置列宽String[] properties = new String[headMap.size()];String[] headers = new String[headMap.size()];int ii = 0;for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {String fieldName = iter.next();properties[ii] = fieldName;headers[ii] = headMap.get(fieldName);int bytes = fieldName.getBytes().length;arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;sheet.setColumnWidth(ii,arrColWidth[ii]*256);ii++;}// 遍历集合数据,产⽣数据⾏int rowIndex = 0;for (Object obj : jsonArray) {if(rowIndex == 65535 || rowIndex == 0){if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第⼆页显⽰SXSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0titleRow.createCell(0).setCellValue(title);titleRow.getCell(0).setCellStyle(titleStyle);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));SXSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1for(int i=0;i<headers.length;i++){headerRow.createCell(i).setCellValue(headers[i]);headerRow.getCell(i).setCellStyle(headerStyle);}rowIndex = 2;//数据内容从 rowIndex=2开始}JSONObject jo = (JSONObject) JSONObject.toJSON(obj);SXSSFRow dataRow = sheet.createRow(rowIndex);for (int i = 0; i < properties.length; i++){SXSSFCell newCell = dataRow.createCell(i);Object o = jo.get(properties[i]);String cellValue = "";if(o==null) cellValue = "";else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);else if(o instanceof Float || o instanceof Double)cellValue= new BigDecimal(o.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();else cellValue = o.toString();newCell.setCellValue(cellValue);newCell.setCellStyle(cellStyle);}rowIndex++;}// ⾃动调整宽度/*for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}*/try {workbook.write(out);workbook.close();workbook.dispose();} catch (IOException e) {e.printStackTrace();}}//Web 导出excelpublic static void downloadExcelFile(String title,Map<String,String> headMap,JSONArray ja,HttpServletResponse response){ try {ByteArrayOutputStream os = new ByteArrayOutputStream();ExcelUtil.exportExcelX(title,headMap,ja,null,0,os);byte[] content = os.toByteArray();InputStream is = new ByteArrayInputStream(content);// 设置response参数,可以打开下载页⾯response.reset();response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename="+ new String((title + ".xlsx").getBytes(), "iso-8859-1")); response.setContentLength(content.length);ServletOutputStream outputStream = response.getOutputStream();BufferedInputStream bis = new BufferedInputStream(is);BufferedOutputStream bos = new BufferedOutputStream(outputStream);byte[] buff = new byte[8192];int bytesRead;while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {bos.write(buff, 0, bytesRead);}bis.close();bos.close();outputStream.flush();outputStream.close();}catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {int count = 100000;JSONArray ja = new JSONArray();for(int i=0;i<100000;i++){Student s = new Student();s.setName("POI"+i);s.setAge(i);s.setBirthday(new Date());s.setHeight(i);s.setWeight(i);s.setSex(i/2==0?false:true);ja.add(s);}Map<String,String> headMap = new LinkedHashMap<String,String>();headMap.put("name","姓名");headMap.put("age","年龄");headMap.put("birthday","⽣⽇");headMap.put("height","⾝⾼");headMap.put("weight","体重");headMap.put("sex","性别");String title = "测试";/*OutputStream outXls = new FileOutputStream("E://a.xls");System.out.println("正在导出xls....");Date d = new Date();ExcelUtil.exportExcel(title,headMap,ja,null,outXls);System.out.println("共"+count+"条数据,执⾏"+(new Date().getTime()-d.getTime())+"ms");outXls.close();*///OutputStream outXlsx = new FileOutputStream("E://b.xlsx");System.out.println("正在导出xlsx....");Date d2 = new Date();ExcelUtil.exportExcelX(title,headMap,ja,null,0,outXlsx);System.out.println("共"+count+"条数据,执⾏"+(new Date().getTime()-d2.getTime())+"ms"); outXlsx.close();}}class Student {private String name;private int age;private Date birthday;private float height;private double weight;private boolean sex;public String getName() {return name;}public void setName(String name) { = name;}public Integer getAge() {return age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public float getHeight() {return height;}public void setHeight(float height) {this.height = height;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public boolean isSex() {return sex;}public void setSex(boolean sex) {this.sex = sex;}public void setAge(Integer age) {this.age = age;}}2. 控制器Controller 的写法//导出配件列表@RequestMapping(value = "partExport")@ResponseBodypublic void partExportHttpServletResponse response){JSONArray ja = ptmpOrderService.selectStatExport();//获取业务数据集Map<String,String> headMap = ptmpOrderService.getPartStatHeadMap();//获取属性-列头String title = "配件统计表";ExcelUtil.downloadExcelFile(title,headMap,ja,response);}3.前端页⾯的写法(不要⽤异步⽅式请求,如$.post)//可以点击⼀个按钮事件触发下⾯的代码进⾏导出window.open("partExport","_blank");//或者可以提交表单$('#form').attr('action','partExport');$('#form').attr('target','_blank');$('#form').submit();4.POI依赖的jar包(maven pom)<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>5.本地测试将10w条数据导出到本地硬盘中,HSSF⽅式⽤时14s左右,SXSSF⽅式⽤时24s左右,尽管如此,但建议使⽤SXSSF导出.xlsx的excel.之所以使⽤JSONArray作为数据集,⽽没有采⽤java的集合类,是因为JSONObject 在获取数据的时候是采⽤ get(key)的⽅式,正好与属性列对应,这样灵活性⾼,属性列不必与java对象的字段匹配。
java使用poi读取ppt文件和poi读取excel、word示例
java使⽤poi读取ppt⽂件和poi读取excel、word⽰例Apache的POI项⽬可以⽤来处理MS Office⽂档,codeplex上还有⼀个它的.net版本。
POI项⽬可创建和维护操作各种基于OOXML和OLE2⽂件格式的Java API。
⼤多数MS Office都是OLE2格式的。
POI通HSMF⼦项⽬来⽀持Outlook,通过HDGF⼦项⽬来⽀持Visio,通过HPBF⼦项⽬来⽀持Publisher。
使⽤POI抽取Word简单⽰例:要引⼊poi-3.7.jat和poi-scratchpad-3.7.ajr这两个包。
复制代码代码如下:package msoffice;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.extractor.WordExtractor;import ermodel.CharacterRun;import ermodel.Paragraph;import ermodel.Range;import ermodel.Section;public class Word {// 直接抽取全部内容public static String readDoc1(InputStream is) throws IOException {WordExtractor extractor = new WordExtractor(is);return extractor.getText();}//分章节Section、段落Paragraph、字符串CharacterRun抽取public static void readDoc2(InputStream is) throws IOException {HWPFDocument doc=new HWPFDocument(is);Range r=doc.getRange();for(int x=0;x<r.numSections();x++){Section s=r.getSection(x);for(int y=0;y<s.numParagraphs();y++){Paragraph p=s.getParagraph(y);for(int z=0;z<p.numCharacterRuns();z++){CharacterRun run=p.getCharacterRun(z);String text=run.text();System.out.print(text);}}}}public static void main(String[] args) {File file = new File("/home/orisun/1.doc");try {FileInputStream fin = new FileInputStream(file);String cont = readDoc1(fin);System.out.println(cont);fin.close();fin = new FileInputStream(file);readDoc2(fin);fin.close();} catch (IOException e) {e.printStackTrace();}}}POI抽取PPT⽰例:复制代码代码如下:package msoffice;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import org.apache.poi.hslf.HSLFSlideShow;import org.apache.poi.hslf.extractor.PowerPointExtractor;import org.apache.poi.hslf.model.Slide;import org.apache.poi.hslf.model.TextRun;import ermodel.SlideShow;public class PPT {//直接抽取幻灯⽚的全部内容public static String readDoc1(InputStream is) throws IOException{ PowerPointExtractor extractor=new PowerPointExtractor(is);return extractor.getText();}//⼀张幻灯⽚⼀张幻灯⽚地读取public static void readDoc2(InputStream is) throws IOException{ SlideShow ss=new SlideShow(new HSLFSlideShow(is));Slide[] slides=ss.getSlides();for(int i=0;i<slides.length;i++){//读取⼀张幻灯⽚的标题String title=slides[i].getTitle();System.out.println("标题:"+title);//读取⼀张幻灯⽚的内容(包括标题)TextRun[] runs=slides[i].getTextRuns();for(int j=0;j<runs.length;j++){System.out.println(runs[j].getText());}}}public static void main(String[] args){File file = new File("/home/orisun/2.ppt");try{FileInputStream fin=new FileInputStream(file);String cont=readDoc1(fin);System.out.println(cont);fin.close();fin=new FileInputStream(file);readDoc2(fin);fin.close();}catch(IOException e){e.printStackTrace();}}}Excel⽂件由多个Workbook组成,⼀个Workbook由多个Sheet组成。
POI操作常用方法
POI操作常用方法POI(Poor Obfuscation Implementation)是一种用于操作Microsoft Office文件的Java库。
它提供了对Excel、Word和PowerPoint等文件的创建、读写和修改的功能。
POI操作常用的方法包括文件的创建、读取和写入、单元格的操作、格式设置、图表的创建和修改等。
1.文件的创建与读取:- 创建一个Excel文件:```Workbook workbook = new XSSFWorkbook(; // 创建一个新的Excel 文件Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个名为Sheet1的工作表```- 读取一个Excel文件:```InputStream inputStream = newFileInputStream("path/to/file.xlsx");Workbook workbook = new XSSFWorkbook(inputStream); // 读取Excel文件Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表```2.单元格的操作:-创建一个单元格并设置值:```Row row = sheet.createRow(0); // 创建第一行Cell cell = row.createCell(0); // 创建第一列cell.setCellValue("Hello World"); // 设置单元格的值```-获取单元格的值:```Row row = sheet.getRow(0); // 获取第一行Cell cell = row.getCell(0); // 获取第一列String value = cell.getStringCellValue(; // 获取单元格的值```3.格式设置:-设置单元格的样式:```CellStyle style = workbook.createCellStyle(; // 创建样式对象Font font = workbook.createFont(; // 创建字体对象font.setBold(true); // 设置字体为粗体style.setFont(font); // 将字体应用于样式cell.setCellStyle(style); // 将样式应用于单元格```-设置单元格的格式:```DataFormat format = workbook.createDataFormat(; // 创建数据格式对象CellStyle style = workbook.createCellStyle(; // 创建样式对象style.setDataFormat(format.getFormat("#,#.00")); // 设置数据的格式,如数字格式为千分位cell.setCellStyle(style); // 将样式应用于单元格```4.图表的创建与修改:-创建一个柱状图:```Drawing<?> drawing = sheet.createDrawingPatriarch(; // 创建图纸对象ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); // 定义图表的位置和大小Chart chart = drawing.createChart(anchor); // 创建图表对象ChartAxis bottomAxis =chart.getChartAxisFactory(.createCategoryAxis(AxisPosition.BOTTO M); // 创建X轴对象ChartAxis leftAxis =chart.getChartAxisFactory(.createValueAxis(AxisPosition.LEFT); // 创建Y轴对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
wwb.}catch (Exception e) {
e.printStackTrace();
//如果是ExcelException,则直接抛出
if(e instanceof ExcelException){
throw (ExcelException)e;
//否则将其它异常包装成ExcelException再抛出
super(message);
// TODO Auto-generated constructor stub
}
public ExcelException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
public ExcelException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
}
2.POI核心处理
/**
* author : SUNZK-QQ:1131341075
* Date : 2018-8-23下午9:13:21
* Comments :导入导出Excel工具类
//如果只有一个工作表的情况
if(1==sheetNum){
WritableSheet sheet=wwb.createSheet(sheetName, i);
fillSheet(sheet, list, fieldMap, 0, list.size()-1);
//有多个工作表的情况
}else{
WritableSheet sheet=wwb.createSheet(sheetName+(i+1), i);
String sheetName,
int sheetSize,
OutputStream out
) throws ExcelException{
if(list.size()==0 || list==null){
throw new ExcelException("数据源中没有任何数据");
}
if(sheetSize>65535 || sheetSize<1){
sheetSize=65535;
}
//创建工作簿并发送到OutputStream指定的地方
WritableWorkbook wwb;
try {
wwb = Workbook.createWorkbook(out);
//因为2003的Excel一个工作表最多可以有65536条记录,除去列头剩下65535条
* Version : 1.0.0
*/
public class ExcelUtil {
/**
* MethodName : listToExcel
* Description :导出Excel(可以导出到本地文件系统,也可以导出到浏览器,可自定义工作表大小)
* param list数据源
* param fieldMap类的英文属性和Excel中的中文列名的对应关系
* param fieldMap类的英文属性和Excel中的中文列名的对应关系
* param out导出流
* throws ExcelException
*/
public static <T> void listToExcel (
List<T> list ,
LinkedHashMap<String,String> fieldMap,
}else{
throw new ExcelException("导出Excel失败");
}
}
}
/**
* MethodName : listToExcel
* Description :导出Excel(可以导出到本地文件系统,也可以导出到浏览器,工作表大小为2003支持的最大值)
* param list数据源
//获取开始索引和结束索引
int firstIndex=i*sheetSize;
int lastIndex=(i+1)*sheetSize-1>list.size()-1 ? list.size()-1 : (i+1)*sheetSize-1;
//填充工作表
fillSheet(sheet, list, fieldMap, firstIndex, lastIndex);
//所以如果记录太多,需要放到多个工作表中,其实就是个分页的过程
//1.计算一共有多少个工作表
double sheetNum=Math.ceil(list.size()/new Integer(sheetSize).doubleValue());
//2.创建相应的工作表,并向其中填充数据
for(int i=0; i<sheetNum; i++){
* param sheetSize每个工作表中记录的最大个数
* param out导出流
* throws ExcelException
*/
public static <T> void listToExcel (
List<T> list ,
LinkedHashMap<String,String> fieldMap,
JAVA POI
1.Exception处理
public class ExcelException extends Exception {
public ExcelException() {
// TODO Auto-generated constructor stub
}
public ExcelException(String message) {
String sheetName,
OutputStream out
) throws ExcelException{
listToExcel(list, fieldMap, sheetName, 65535, out);
*如果需要的是引用对象的属性,则英文属性使用类似于EL表达式的格式
*如:list中存放的都是student,student中又有college属性,而我们需要学院名称,则可以这样写
* fieldMap.put("college.collegeName","学院名称")
* param sheetName工作表的名称