POI实现Java程序操作Excel报表的应用分析
java excel处理详解
java excel处理详解Java是一种强大的编程语言,它可以帮助开发者快速开发出各种各样的应用程序。
在很多场合,我们需要使用Java来处理Excel表格。
下面将详细讲解Java如何处理Excel 表格。
1. 读取Excel文件要读取Excel文件,我们需要使用Java中的Apache POI库。
以下是读取Excel文件的代码示例:```import java.io.File;import java.io.FileInputStream;import java.io.IOException;import ermodel.*;public class ReadExcelFile {// 获取工作表数量int numberOfSheets = workbook.getNumberOfSheets();System.out.println("Number of sheets: " + numberOfSheets);// 遍历行for (Row row : sheet) {// 遍历单元格for (Cell cell : row) {String value = cell.getStringCellValue();System.out.print(value + " ");}System.out.println();}}// 关闭输入流inputStream.close();}}```这段代码首先打开一个Excel文件(data.xlsx),然后使用WorkbookFactory创建一个工作簿对象。
我们可以使用getNumberOfSheets()方法获取工作表的数量。
接着使用getSheetAt()方法遍历每个工作表。
使用for each循环遍历每一行,再遍历每一个单元格。
最后,关闭输入流。
// 创建一个工作表对象Sheet sheet = workbook.createSheet("Sheet1");// 创建行和单元格Row row = sheet.createRow(0);Cell cell = row.createCell(0);cell.setCellValue("Hello World!");这段代码首先创建一个新的工作簿对象。
java的POI操作Excel文件
java的POI操作Excel文件(2)现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。
1、设置分页符的bugPOI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。
Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。
解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。
如果sheet是由POI生成的则没有这个问题。
我跟踪了setRowBreak的源代码,发现是Sheet.Java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel插入一个分页符来触发POI为rowBreaks创建实例。
2、如何拷贝行我在的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写://注:this.fWorkbook是一个HSSHWorkbook,请自行在外部newpublic void copyRows(String pSourceSheetName,String pTargetSheetName,int pStartRow, int pEndRow,int pPosition){HSSFRow sourceRow = null;HSSFRow targetRow = null;HSSFCell sourceCell = null;HSSFCell targetCell = null;HSSFSheet sourceSheet = null;HSSFSheet targetSheet = null;Region region = null;int cType;int i;short j;int targetRowFrom;int targetRowTo;if ((pStartRow == -1) || (pEndRow == -1)){return;}sourceSheet = this.fWorkbook.getSheet(pSourceSheetName);targetSheet = this.fWorkbook.getSheet(pTargetSheetName);//拷贝合并的单元格for (i = 0; i < sourceSheet.getNumMergedRegions(); i++){region = sourceSheet.getMergedRegionAt(i);if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <= pEndRow)) {targetRowFrom = region.getRowFrom() - pStartRow + pPosition; targetRowTo = region.getRowTo() - pStartRow + pPosition;region.setRowFrom(targetRowFrom);region.setRowTo(targetRowTo);targetSheet.addMergedRegion(region);}}//设置列宽for (i = pStartRow; i <= pEndRow; i++){sourceRow = sourceSheet.getRow(i);if (sourceRow != null){for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++) {targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j));}break;}}//拷贝行并填充数据for (;i <= pEndRow; i++){sourceRow = sourceSheet.getRow(i);if (sourceRow == null){continue;}targetRow = targetSheet.createRow(i - pStartRow + pPosition);targetRow.setHeight(sourceRow.getHeight());for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)sourceCell = sourceRow.getCell(j);if (sourceCell == null){continue;}targetCell = targetRow.createCell(j);targetCell.setEncoding(sourceCell.getEncoding());targetCell.setCellStyle(sourceCell.getCellStyle());cType = sourceCell.getCellType();targetCell.setCellType(cType);switch (cType){case HSSFCell.CELL_TYPE_BOOLEAN:targetCell.setCellValue(sourceCell.getBooleanCellValue());break;case HSSFCell.CELL_TYPE_ERROR:targetCell.setCellErrorV alue(sourceCell.getErrorCellValue());break;case HSSFCell.CELL_TYPE_FORMULA://parseFormula这个函数的用途在后面说明targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));break;case HSSFCell.CELL_TYPE_NUMERIC:targetCell.setCellValue(sourceCell.getNumericCellV alue());break;case HSSFCell.CELL_TYPE_STRING:targetCell.setCellValue(sourceCell.getStringCellValue());break;}}}}这个函数有两个问题暂时无法解决:a、只能在同一个Workbook里面使用,跨Workbook总是拷不过去,不知道为什么?b、由于在拷贝行时也把行高也拷过去了,如果往这些单元格里写入的数据长度超过单元格长度,那么他们不会自动调整行高!3、公式的问题POI对Excel公式的支持是相当好的,但是我发现一个问题,如果公式里面的函数不带参数,比如now()或today(),那么你通过getCellFormula()取出来的值就是now(ATTR(semiV olatile))和today(ATTR(semiV olatile)),这样的值写入Excel是会出错的,这也是我上面copyRow的函数在写入公式前要调用parseFormula的原因,parseFormula这个函数的功能很简单,就是把ATTR(semiVolatile)删掉,我把它的代码贴出来:private String parseFormula(String pPOIFormula){final String cstReplaceString = "ATTR(semiV olatile)"; //$NON-NLS-1$StringBuffer result = null;int index;result = new StringBuffer();index = pPOIFormula.indexOf(cstReplaceString);if (index >= 0){result.append(pPOIFormula.substring(0, index));result.append(pPOIFormula.substring(index + cstReplaceString.length()));}else{result.append(pPOIFormula);}return result.toString();}至于为什么会出现ATTR(semiVolatile),还需要大家的探索精神!4、向Excel写入图片的问题。
通过实例跟我学如何应用Java操作Excel表格——使用Apache Jakarta POI项目操作Excel电子表格文件的应用实例
1.1通过代码实例跟我学如何应用Java操作Excel电子表格——使用Apache Jakarta POI项目操作Excel电子表格文件的应用实例1.1.1在Java程序中操作微软Office中的EXCEL电子表格的应用技术1、技术开发背景(1)MS Excel应用十分普及MS的电子表格(Excel)是Office的重要成员,是保存统计数据的一种常用格式。
作为办公文档,势必要涉及到的电子文档的交换,Excel是一种在企业中非常通用的文件格式,打印和管理也比较方便。
在一个Java应用中,将一部分数据生成Excel格式,是与其他系统无缝连接的重要手段。
(2)为Web方式的数据报表及打印提供另一种解决方案对于程序员特别是从事信息管理编程的程序员来说,报表打印是整个编程过程中最麻烦但又必须做的事情,我们常用的方法就是:1)将数据库记录导出到Excell中;2)利用各种报表工具(如CrystalReport或ActiveReport等)生成报表文件然后再在程序中调用;3)辅助Active打印插件定制格式,直接打印窗体;对于第三种方法一般是特别行业(即报表格式及数据不许修改)需要的,比如财务报表和政策法规或支付凭证等;对第一种方法对普遍的行业适用,我们在下面重点介绍怎样将数据表中的各个记录导入到微软的Excel 中并怎样控件Excel单元格式以便做出合适的报表。
(3)在Java程序中实现对Excel文档中的数据进行分析、搜集、处理是很有用途的用户的临时数据保存在Excel中由于用户常常在系统中需要录入相当量的数据,这些数据一般以某种特定的格式保存。
而Excel正是一种相当规格的数据保存方式,至少它是易于格式化的,而且客户也能够按照某种特定的格式来将数据录入到Excel文件中去。
那我们就需要了解如何将用户保存在Excel中的数据获得。
需要对用户保存在Excel中的数据进行处理,然后再写入到数据库表中我们希望用户将资料录入Excel的目的往往只有一个就是将这些数据导入到数据库中去。
java解析excel根据列列出数据的方法
java解析excel根据列列出数据的方法在Java中解析Excel文件可以使用Apache POI库来实现。
下面是一个简单的示例代码,用于解析Excel文件并将其中其中一列的数据列出来。
首先,需要在项目中添加Apache POI库的依赖。
```xml<!-- Apache POI 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>```然后,可以使用以下代码来解析Excel文件,并输出其中一列的数据。
```javaimport ermodel.*;import java.io.FileInputStream;import java.io.IOException;public class ExcelParserpublic static void main(String[] args)String filePath = "path_to_excel_file.xlsx";int columnIndex = 0;try (FileInputStream file = new FileInputStream(filePath); Workbook workbook = WorkbookFactory.create(file))Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表for (Row row : sheet)Cell cell = row.getCell(columnIndex); // 获取指定列的单元格if (cell != null)String cellValue = getCellValueAsString(cell);System.out.println(cellValue);}}} catch (IOException e)e.printStackTrace(;}private static String getCellValueAsString(Cell cell) switch (cell.getCellType()case STRING:return cell.getStringCellValue(;case NUMERIC:if (DateUtil.isCellDateFormatted(cell))return cell.getDateCellValue(.toString(;} elsereturn String.valueOf(cell.getNumericCellValue();}case BOOLEAN:return String.valueOf(cell.getBooleanCellValue(); case FORMULA:return cell.getCellFormula(;default:return "";}```在上述示例代码中,`filePath`变量表示Excel文件的路径,`columnIndex`变量表示要列出数据的列索引(从0开始)。
Java使用POI操作Excel
Java使⽤POI操作Excel Java中常见的⽤来操作 Excel 的⽅式有2种:JXL和POI。
JXL只能对 Excel进⾏操作,且只⽀持到 Excel 95-2000的版本。
⽽POI是Apache 的开源项⽬,由Java编写的跨平台 Java API,可操作 Microsoft Office。
借助POI,可以⽅便的⽣成数据报表,数据批量上传,数据备份等⼯作。
⼀.简单使⽤1.创建Maven⼯程导⼊POI坐标<!-- poi 相关 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.0.1</version></dependency>2.使⽤APIHSSF : 读写 Microsoft Excel XLS 格式⽂档XSSF : 读写 Microsoft Excel OOXML XLSX 格式⽂档SXSSF : 读写 Microsoft Excel OOXML XLSX 格式⽂档HWPF : 读写 Microsoft Word DOC 格式⽂档HSLF : 读写 Microsoft PowerPoint 格式⽂档HDGF : 读 Microsoft Visio 格式⽂档HPBF : 读 Microsoft Publisher 格式⽂档HSMF : 读 Microsoft Outlook 格式⽂档3.操作⽰例//1.创建Excel对象XSSFWorkbook wb = new XSSFWorkbook();//2.创建Sheet对象Sheet sheet = wb.createSheet();//3.创建⾏对象(索引从0开始)Row nRow = sheet.createRow(0);//4.设置⾏⾼和列宽nRow.setHeightInPoints(26.25f);sheet.setColumnWidth(1,26*256); //(列的索引,列宽*256(理解为固定写法))//5.创建单元格对象(索引从0开始)Cell nCell = nRow.createCell(0);//6.设置单元格内容nCell.setCellValue("dinTalk");//==============================//7.创建单元格样式对象CellStyle style = wb.createCellStyle();//8.创建字体对象Font font = wb.createFont();//9.设置字体和其⼤⼩及效果font.setFontName("⿊体");font.setFontHeightInPoints((short)12);font.setBold(true); //加粗//10.设置样式style.setFont(font);style.setAlignment(HorizontalAlignment.CENTER); //横向居中style.setVerticalAlignment(VerticalAlignment.CENTER);//纵向居中style.setBorderTop(BorderStyle.THIN); //上细线style.setBorderBottom(BorderStyle.THIN); //下细线style.setBorderLeft(BorderStyle.THIN); //左细线style.setBorderRight(BorderStyle.THIN); //右细线//11.为单元格应⽤样式nCell.setCellStyle(style);⼆.使⽤模板1.模板打印(下载)我们通过⾃定义⽣成 Excel 报表⽂件很是⿇烦,特别是字体、样式⽐较复杂的时候。
POI实现Java程序操作Excel报表的应用分析
栏目编辑:梁春丽 E-mail:lianglizi505@软件服务472010年第7期FINANCIAL COMPUTER OF HUANAN 报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用性,不方便用户进行个性化编辑。
Java程序由于其跨平台特性,不能直接操纵Excel。
鉴于此,本文探讨一下POI实现Java程序中操作Excel报表的应用。
一、POI简介Jakarta POI 是apache的子项目,目标是处理ole2对象。
它提供了一组操纵Windows文档的Java API 。
目前比较成熟的是HSSF (Horrible SpreadSheet Format )接口,处理MS Excel (97-2002)对象。
通过HSSF ,开发人员可以用纯Java代码来读取、写入、修改Excel文件。
二、POI应用配置POI包可以在Apache 官方网站下载。
下载后,解压缩得到如图1所示的目录结构。
在应用中主要用poi-3.1-FINAL-20080629.jar这个库文件。
如果是纯Java应用程序,需把该文件的路径添加到系统环境变量classpath 中,否则无法编译;如果是Java Web应用,则需要将该库文件部署到应用程序的\WEB-INF\lib目录下。
POI实现Java程序操作Excel报表的应用分析■ 中国人民银行南昌中心支行 王暹昊中国人民银行上饶市中心支行 朱勇士还有辅助操作等。
最主要的对象见表1所列。
表1 POI的主要对象(一)POI的简单应用下例中,实现的主要功能为:使用表1中的对象在程序的当前目录下创建一个Excel文件test.xls,在第一个单元格中写入内容,然后读出该单元格的内容。
主要程序部分为:public class CreateExcelReport { public static String xlsFile="test.xls"; //Excel文件的名称 public static void main(String args[]){ try{HSSFWorkbook workbook = new HSSFWorkbook(); //产生工作簿对象HSSFSheet sheet = workbook.createSheet(); //产生工作表对象//设置第一个工作表的名称为firstSheet,设置字符编码为UTF_16wo r k b o o k.s e t S h e e t Na m e (0,"f i r s t S h e e t",HSSFWorkbook.ENCODING_UTF_16);//产生一行,且为第一行HSSFRow row = sheet.createRow((short)0);//产生该行的第一个单元格HSSFCell cell = row.createCell((short) 0);cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setEncoding(HSSFCell.ENCODING_UTF_16);图1 POI的目录结构三、POI的应用POI提供给用户使用的对象在ermodel包中,主要部分包括Excel对象、样式和格式,栏目编辑:梁春丽 E-mail:lianglizi505@软件服务482010年第7期FINANCIAL COMPUTER OF HUANAN//往第一个单元格中写入信息cell.setCellValue("测试消息");FileOutputStream fOut = new FileOutputStream(xlsFile);workbook.write(fOut);fOut.flush();System.out.println("生成文件...");//以下语句读取生成的Excel文件内容FileInputStream fIn=new FileInputStream(xlsFile);HSSFWorkbook readWorkBook= new HSSFWorkbook (fIn);HSSFSheet readSheet= readWorkBook.getSheet ("firstSheet");HSSFRow readRow =readSheet.getRow(0);HSSFCell readCell = readRow.getCell((short)0);System.out.println(readCell.getStringCellValue()); }catch(Exception e) {System.out.println(e);}}}(二)结合数据库应用使用POI,可以方便地将数据库中的数据导出生成Excel报表,也可以读取上传的Excel报表,并将其内容写入数据库表中保存。
通过代码实例跟我学如何应用Java操作Excel电子表格——在Java程序中应用POI操作Exce电子表格的应用实例
1.1通过代码实例跟我学如何应用Java操作Excel电子表格——在Java程序中应用POI操作Exce电子表格的应用实例1.1.1应用POI操作Excel的J2SE示例1、利用Jakarta OPI实现创建Excel文件的主要实现步骤(1)创建文件HSSFWorkbook workbook = new HSSFWorkbook();(2)在workbook中创建一个名为“Excel表名称”的工作表HSSFSheet worksheet= workbook.createSheet(“Excel表名称”);(3)在表sheet中创建新行HSSFRow row = worksheet.createRow((short)0);(4)在行row总创建单元格HSSFCell cell = row.createCell((short)0);(5)在单元格内置入内容cell.setCellValue(“这是该单元格中的内容”);(6)将workbook写入到文件中workbook.write(fileOutputStream);2、下面给出在Eclipse中创建Excel文件的J2SE的示例代码(1)新建一个Java 项目(2)在该项目中添加poi-3.0-alpha3-20061212.jar(3)在该项目中添加下面的代码类名称为CreateExcelDemo,包名称为com.px1987.poiexcel.demo编程其代码------POI HSSF的类文件都放在在org.apache.poi.hssf包下,通过此包中的类就可实现用java操作Excel文件了。
(4)CreateExcelDemo程序类的代码示例package com.px1987.poiexcel.demo;import ermodel.HSSFFont;import ermodel.HSSFWorkbook;import ermodel.HSSFSheet;import ermodel.HSSFRow;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFDataFormat;import java.io.FileOutputStream;import java.util.*;public class CreateExcelDemo{public static String outputFile="excelData.xls"; //所要产生的Excel 文件,假定在当前目录public static void main(String argv[]){try{HSSFWorkbook oneWorkBook = new HSSFWorkbook(); // 创建新的Excel 工作簿// 在Excel工作簿中建一工作表,其名为缺省值, 如要新建一名为"2007年销售指标"的工作表,其语句为:HSSFSheet sheet = oneWorkBook.createSheet("2007年销售指标");HSSFRow row = sheet.createRow((short)0); // 在索引0的位置创建行(最顶端的行)HSSFCell cell = row.createCell((short) 0); //在索引0的位置创建单元格(左上端)cell.setCellType(HSSFCell.CELL_TYPE_STRING); // 定义单元格为字符串类型cell.setCellValue("销售量"); // 在单元格中输入一些内容row.createCell((short)1).setCellValue(1.2);row.createCell((short)2).setCellValue("我们所添加的内容");row.createCell((short)3).setCellValue(true);cell = row.createCell((short)4);cell.setCellValue(new Date());HSSFFont font = oneWorkBook.createFont();font.setColor(HSSFFont.COLOR_RED);font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);HSSFCellStyle cellStyle = oneWorkBook.createCellStyle();cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));cellStyle.setFont(font);cell = row.createCell((short)4);cell.setCellValue(new Date());cell.setCellStyle(cellStyle); //在此单元中应用该风格FileOutputStream fOut = new FileOutputStream(outputFile); // 新建一输出文件流oneWorkBook.write(fOut); // 把相应的Excel 工作簿存盘fOut.flush();fOut.close(); // 操作结束,关闭文件System.out.println(outputFile+"已经正确地被创建出!");}catch(Exception e){System.out.println("出现下面的异常错误" + e.getMessage() );}}}上面的代码创建一个Excel文件excelData.xls,并在第一行的第一格中写入我们指定的数据。
Java用POI导入导出Excel实例分析
Java⽤POI导⼊导出Excel实例分析1、异常ng.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException解决⽅法:使⽤的poi的相关jar包⼀定版本⼀定要相同2、maven所使⽤jar包,没有使⽤maven的话,就⽤poi-3.9.jar和poi-ooxml-3.9.jar(这个主要是⽤于Excel2007以后的版本)两个jar包就⾏() <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency>3、java导⼊Excel先上传Excel//上传Excel@RequestMapping("/uploadExcel") public boolean uploadExcel(@RequestParam MultipartFile file,HttpServletRequest request) throws IOException { if(!file.isEmpty()){ String filePath = file.getOriginalFilename(); //windowsString savePath = request.getSession().getServletContext().getRealPath(filePath); //linux //String savePath = "/home/odcuser/webapps/file";File targetFile = new File(savePath); if(!targetFile.exists()){targetFile.mkdirs();}file.transferTo(targetFile); return true;} return false;}在读取Excel⾥⾯的内容public static void readExcel() throws Exception{InputStream is = new FileInputStream(new File(fileName));Workbook hssfWorkbook = null; if (fileName.endsWith("xlsx")){hssfWorkbook = new XSSFWorkbook(is);//Excel 2007}else if (fileName.endsWith("xls")){hssfWorkbook = new HSSFWorkbook(is);//Excel 2003} // HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is); // XSSFWorkbook hssfWorkbook = new XSSFWorkbook(is);User student = null;List<User> list = new ArrayList<User>(); // 循环⼯作表Sheetfor (int numSheet = 0; numSheet <hssfWorkbook.getNumberOfSheets(); numSheet++) { //HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);Sheet hssfSheet = hssfWorkbook.getSheetAt(numSheet); if (hssfSheet == null) { continue;} // 循环⾏Rowfor (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) { //HSSFRow hssfRow = hssfSheet.getRow(rowNum);Row hssfRow = hssfSheet.getRow(rowNum); if (hssfRow != null) {student = new User(); //HSSFCell name = hssfRow.getCell(0); //HSSFCell pwd = hssfRow.getCell(1);Cell name = hssfRow.getCell(0);Cell pwd = hssfRow.getCell(1);//这⾥是⾃⼰的逻辑 student.setUserName(name.toString());student.setPassword(pwd.toString());list.add(student);}}}}4、导出Excel//创建Excel@RequestMapping("/createExcel") public String createExcel(HttpServletResponse response) throws IOException { //创建HSSFWorkbook对象(excel的⽂档对象)HSSFWorkbook wb = new HSSFWorkbook();//建⽴新的sheet对象(excel的表单)HSSFSheet sheet=wb.createSheet("成绩表");//在sheet⾥创建第⼀⾏,参数为⾏索引(excel的⾏),可以是0~65535之间的任何⼀个HSSFRow row1=sheet.createRow(0);//创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何⼀个HSSFCell cell=row1.createCell(0); //设置单元格内容cell.setCellValue("学员考试成绩⼀览表");//合并单元格CellRangeAddress构造参数依次表⽰起始⾏,截⾄⾏,起始列,截⾄列sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));//在sheet⾥创建第⼆⾏HSSFRow row2=sheet.createRow(1); //创建单元格并设置单元格内容row2.createCell(0).setCellValue("姓名");row2.createCell(1).setCellValue("班级");row2.createCell(2).setCellValue("笔试成绩");row2.createCell(3).setCellValue("机试成绩"); //在sheet⾥创建第三⾏HSSFRow row3=sheet.createRow(2);row3.createCell(0).setCellValue("李明");row3.createCell(1).setCellValue("As178");row3.createCell(2).setCellValue(87);row3.createCell(3).setCellValue(78); //.....省略部分代码//输出Excel⽂件OutputStream output=response.getOutputStream();response.reset();response.setHeader("Content-disposition", "attachment; filename=details.xls");response.setContentType("application/msexcel");wb.write(output);output.close(); return null;}补充说明乱码问题1、⽂件名乱码(我发现只要解决了⽂件名乱码,其他乱码也会跟着解决)response.setHeader("Content-disposition", "attachment; filename=中⽂.xls");这个⽅法可以当做⼀个公⽤⽅法来使⽤,以后有乱码的都可以调⽤此⽅法public static String toUtf8String(String s){StringBuffer sb = new StringBuffer();for (int i=0;i<s.length();i++){char c = s.charAt(i);if (c >= 0 && c <= 255){sb.append(c);}else{byte[] b;try { b = Character.toString(c).getBytes("utf-8");}catch (Exception ex) {System.out.println(ex);b = new byte[0];}for (int j = 0; j < b.length; j++) {int k = b[j];if (k < 0) k += 256;sb.append("%" + Integer.toHexString(k).toUpperCase());}}}return sb.toString();}调⽤的时候,response.setHeader("Content-disposition", "attachment; filename="+toUtf8String("中⽂.xls"));我上⽹查的时候,⽹上是说今天要说的是在创建⼯作表时,⽤中⽂做⽂件名和⼯作表名会出现乱码的问题,先说以中⽂作为⼯作表名,⼤家创建⼯作表的代码⼀般如下:HSSFWorkbook workbook = new HSSFWorkbook();//创建EXCEL⽂件HSSFSheet sheet= workbook.createSheet(sheetName); //创建⼯作表这样在⽤英⽂名作为⼯作表名是没问题的,但如果sheetName是中⽂字符,就会出现乱码,解决的⽅法如下代码:HSSFSheet sheet= workbook.createSheet();workbook.setSheetName(0, sheetName,(short)1); //这⾥(short)1是解决中⽂乱码的关键;⽽第⼀个参数是⼯作表的索引号。
“java+poi+模板”打造复杂excel报表
“java+poi+模板”打造复杂excel报表“Java+POI+模板”打造复杂Excel 报表做的Struts 项目中有这样的功能,用户可以将数据导出到Excel 报表,如图1 所示。
图1 报表样式图1 设计思路Java 对于Excel 的操作一般借助于POI 类库,由于该报表的表头比较复杂,直接用POI 控制报表的生成比较困难,这时可以先制作Excel 报表模板,而后再通过Java 调用POI 函数将用户数据写入到Excel 报表模板,最后导出到新的目标文件即可。
2 设计步骤2.1 Excel 报表模板根据需要设计出Excel 报表,并保存为report.xls。
该报表有复杂的表头,报表第4 行为合计行,用于对所有数值型列的各行数据进行汇总,如图1 所示。
2.2 Struts 的动作执行函数ExcelExportAction该Action 函数在用户需要执行报表导出时通过Struts 页面调用或用户触发执行。
package com.tj.struts.action;import java.io.FileOutputStream;import javax.servlet.http.*;import org.apache.struts.action.*;import databaseUtil.ExcelPoi;public class ExcelExportAction extends Action {public ActionForward execute ( ActionMappingmapping,ActionForm form,HttpServletRequestrequest,HttpServletResponse response)throws Exception {//执行SQL 获得输出到报表的数据String sql=" select * fron project" ;//准备输出的报表路径,及文件名String outputfile =" c:\\output.xls" ;//制作好的报表模板存放路径String templatefile=" c:\\report.xls" ;//模板的列数为39int column=39;try {//实例化具体的业务处理类ExcelPoiExcelPoi pd = new ExcelPoi (colnum) ;//getExcelSheet 以sql 为参数执行查询,将查询数据写入模版文件“templatefile”的当前工作簿的选定工作表pd.getExcelSheeet (sql,templatefile) ;// 新建以文件outputfile 为目标的输出文件流FileOutputStream fos = new FileOutputStream (outputfile) ; //将工作簿写入输出文件流,得到输出报表文件pd.exportExcel (fos) ;} catch (Exception e) {e.printStackTrace () ;} finally {try {fos.close () ;} catch (Exception e) {e.printStackTrace () ;}}return mapping.findForward (" success") ;}}2.3 设计业务处理类ExcelPoipackage databaseUtil;import java.io.*;import java.sql.*;import java.util.*;import ermodel.*;public class ExcelPoi {private int columNumber = 0;private int cellNumber=0;private HSSFWorkbook workbook = null;private HSSFSheet worksheet=null;public ExcelPoi (int columNumber){this.columNumber=columNumber;}—sql:传入参数,实现输出数据查询,templatefile:传入参数,Excel 模板的存放路径-->public void getExcelSheeet ( String sql,String templatefile) throws SQLException{try {//新建以文件templatefile 为源文件的输文件流,而后从中取得模板文件templatefile 的当前工作簿workbook = new HSSFWorkbook ( new FileInputStream (templatefile)) ;} catch (FileNotFoundException e) {e.printStackTrace () ;} catch (IOException e) {e.printStackTrace () ;}//取得当前工作簿中的“天津大学工程项目库管理系统”工作表worksheet=workbook.getSheet (" 天津大学工程项目库管理系统") ;//载入数据库驱动,获得数据库的连接,数据库名为tj,用户名swm,密码adminClass.forName ( "com.microsoft.jdbc.sqlserver.SQLServerDriver") .newInstance () ;dbConn = DriverManager.getConnection (" jdbc:microsoft: sqlserver://localhost:1433;DatabaseName =tj" , " swm" , " admin") ;statement = dbConn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE) ;//以SQL 为参数,执行数据查询ResultSet rs = statement.executeQuery (sql) ;int rowIndex = 4;while (rs.next ()){ List list = new ArrayList () ;//将查询得到的每行数据放入list 中for (int i = 1;i{list.add (rs.getString (i)) ; }//调用createTableRow 把list 中数据写入worksheet 的第rowIndex 行createTableRow (worksheet,list, (short) rowIndex) ;rowIndex++;}}—-用list 数据创建当前工作表的第rowIndex 行,并将该行非String 数据累加到合计行行-->public void createTableRow ( HSSFSheet worksheet1,List list,short rowIndex){//getRow (3) 取得工作表的第四行,即合计行(行数从0 开始)HSSFRow sumrow = worksheet1.getRow (3) ;for (short i = 0;i{ HSSFCell cell = sumrow.getCell (i) ;//将list 中1、2、3、4、6、7、8 列之外(这几列为String 类型不进行合计),其它列数据累加到合计行的对应列单元中if (! (i==0||i==1||i==2||i==3||i==5||i==6||i==7)) {cell.setCellValue ( list.getNumericCellValue ( ) + ( double) Integer.parseInt ((String) list.get (i))) ;}}//创建当前工作表的新行,等待放入数据HSSFRow row = worksheet1.createRow ( ( short)rowIndex) ; //在新创建行中创建各列单元格,并将list 中对应数据写入for (short i = 0;i{HSSFCell cell = row.createCell ((short) i) ;cell.setEncoding (HSSFCell.ENCODING_UTF_16) ;cell.setCellValue ((String) list.get (i)) ; }该函数将存储了数据的模板文件导出到输出文件流,创建一个新的报表-->public void exportExcel ( OutputStream os) throws IOException{worksheet.setGridsPrinted (true) ;workbook.write (os) ;}}3 结语对于一些要求非常苛刻的报表输出可以借助于一些第三方插件,比如水晶报表等。
java的POI操作Excel文件
java 的POI 操作Excel 文件(1)微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word ,Excel 。
时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发。
然而在要求更高的服务器领域,微软本身的产品移植性不好,领域,微软本身的产品移植性不好,性能不佳。
在我们实际的开发中,表现层的解决方案虽然有多样,但是Ie 浏览器已成为最多人使用的浏览器,因为大家都用Windows 。
在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel 打开。
或者是:我们已经习惯用Excel 打印。
这样子如果用.net 开发是没有问题的,开发是没有问题的,但是有但是有j2ee 这个比.net 更有前途的开放式的开发环境,更有前途的开放式的开发环境,难道我为了解决难道我为了解决打印的要求去另写客户端的控件?或者在服务器端使用本地代码?第一种方案的问题是关键数据的处理有时候不能在客户端做,第2种方案的问题是牺牲了代码的可移植性和稳定性。
如果让客户端只负责处理生成好的报表,那将是一种诱人的选择。
性。
如果让客户端只负责处理生成好的报表,那将是一种诱人的选择。
Apache 的Jakata 项目的POI 子项目,目标是处理ole2对象。
目前比较成熟的是HSSF 接口,处理MS MS ExcelExcel (97-2002)对象。
它不象我们仅仅是用csv 生成的没有格式的可以由Excel 转换的东西,转换的东西,而是真正的而是真正的Excel 对象,你可以控制一些属性如sheet,cell 等等。
这是一个年轻的项目,所以象HDF 这样直接支持W ord 对象的好东西仍然在设计中。
其它支持word 格式的纯java 方案还有itext ,不过也是仍在奋斗中。
但是HSSF 已经成熟到能够和足够我们使用了。
另外,无锡永中Office 的实现方案也是纯java 的解决方案,不过那也是完全商业的产品,并不是公开代码项目。
javaexcel解析常见方法
一、介绍在日常工作中,我们经常会遇到需要处理Excel文件的情况。
而对于Java程序员来说,对Excel文件进行解析是一项常见的任务。
本文将介绍一些常见的JavaExcel解析方法,希望能够帮助大家更好地处理Excel文件。
二、使用POI库解析Excel1. POI库简介POI(Poor Obfuscation Implementation)是Apache软件基金会的开源项目,旨在提供Java程序操作Microsoft Office格式文件的功能。
在处理Excel文件时,可以使用POI库来完成读取、写入和修改Excel文件的操作。
2. 使用POI库解析Excel的基本步骤a. 创建一个输入流,将Excel文件加载到工作簿中。
b. 获取工作表,可以根据工作表的名称或索引来获取。
c. 遍历工作表,获取每一行的数据。
d. 遍历每一行,获取单元格的数值并进行相应的处理。
3. 代码示例```java// 读取Excel文件File file = new File("test.xlsx");FileInputStream fis = new FileInputStream(file); XSSFWorkbook workbook = new XSSFWorkbook(fis);// 获取工作表XSSFSheet sheet = workbook.getSheetAt(0);// 遍历工作表for (Row row : sheet) {// 遍历行for (Cell cell : row) {// 获取单元格的值String value = cell.getStringCellValue();// 进行相应的处理}}// 关闭流fis.close();```4. 注意事项使用POI库解析Excel时,需要注意处理空单元格、日期格式、数值类型等特殊情况,以确保解析的准确性。
三、使用EasyExcel库解析Excel1. EasyExcel库简介EasyExcel是阿里巴巴开源的一款针对大数据量Excel操作的Java库。
java通过POI技术操作Excel(2)----模板读取,录入数据
java通过POI技术操作Excel(2)----模板读取,录⼊数据 先来回顾下通常把java对Excel的操作分为以下功能:1、⽣成模板,导出模板;2、填充模板,录⼊数据;3;读取数据库数据,导出数据;在上⼀篇博⽂中,我简单记录了模板⽣成和导出,在这篇博⽂中,主要来记录--Excel⽂件导⼊,数据录⼊(仍然是以jsp+servlet为例) 既然要解决这个问题,那⾸先来分析下我们需要⾯对的有哪些需求需要实现: 1、Excel⽂件导⼊(这是最基础的,巧妇难为⽆⽶之炊,导⼊环节也是查了好久才完成的); 2、Excel⽂件中数据的格式判定,你要读取⽂件,如果⽂件中其实没有数据怎么办,程序会报错么; 3、Excel⽂件中数据的数值判定,“编号”啊,“⾝份证号”啊之类是不是需要有⼀定的规范才说明数值是正确的,否则录⼊毫⽆意义,数据库中可能还会报错; 4、Excel⽂件中数据判定完成后,判定全部正确的,全部录⼊数据库,录⼊成功显⽰录⼊成功,录⼊不成功则修改录⼊环节; 判定如果存在错误,将所有出现错误的列汇总,返回界⾯提⽰所有出错的列;⾸先,我们来完成导⼊功能,实现如下效果:相信这个上传效果,很多⼈都能实现,<input type="file">如是⽽已嘛,但是实现它后我们如何进⾏excel数据操作呢?通常我们想到的有如下两种⽅法:1、将excel⽂件传上去,然后对传上的⽂件进⾏操作,因为我们传到哪了我们知道,可以直接获取路径;2、我们可以直接获取想要上传的⽂件在电脑上的路径,然后我们通过路径直接对⽂件进⾏操作;这⾥我主要来介绍下我实现的第⼆种⽅法,(以ie浏览器为例,其它浏览器暂不讨论)1function upLoad(){2var myFile=document.getElementById("myFile");3 myFile.select();4var realPath=document.selection.createRange().text;5var len=realPath.length;6var path=realPath.substr(len-4);7if(path==".xls"){ document.getElementById("myForm").action="upLoad?path="+realPath;8 document.getElementById("myForm").submit();9 }else{10 alert("请输⼊excel格式的⽂件");11 }12 }通常情况下,在ie7之前我们可以通过document.getElementById('file_upl').value 直接获取⽂本的本地路径,但是在ie8之后,处于安全性考虑,上传时获取以上value 值则会以“C:\fakepath\”来代替了,这个时候我们就需要上⽂中出现的var myFile=document.getElementById("myFile"); myFile.select();varrealPath=document.selection.createRange().text;这三步来进⾏完成了。
java中使用POI解析Excel文件
if(workbook.getSheetAt(numSheets) != null) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet
NumberFormat formater = NumberFormat.getInstance();
formater.setGroupingUsed(false);
if(cell != null) {
switch(cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
content.append(this.convertCell(cell)).append("\t"); //获得一个单元格的值
}
}
content.append("\n");
}
}
}
return content.toString();
cellValue = formater.format(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_BLANK:
cellValue = cell.getStringCellValue();
break;
if (workbook.getSheetAt(numSheets) != null) {
XSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet
POI实现Java程序操作Excel报表的应用分析
软件服务目栏目编辑粱春丽E-mad:hanghzlS05@163cornIEdPOI实现Java程序操作Excel|H表的应用分析●中国人民银行南昌中心支行王逢吴中国人民银行上饶市中心支行朱勇士报表输出是Java应用开发中经常涉及的内容,而一般的报表往往缺乏通用性,不方便用户进行个性化编辑。
Java程序由于其跨平台特性,不能直接操纵Excel。
鉴于此,本文探讨—下POI实现Java程序中操作Excel报表的应用。
一.POI简介JakartaPOI是apache的子项目,目标是处理ole2对象。
它提供了_一组操纵Windows文档的JavaAPI。
目前比较成熟的是HSSF(HorribleSpreadSheetFormat)接口,处理MSExcel(97—2002)对象。
通过HSSF,开发人员可以用纯Java代码来读取、写入、修改Excel文件。
二.POI应用配置POI包可以在Apache官方网站下载。
下载后,解压缩得到如图1所示的目录结构。
在应用中主要用poi-3.1一FINAL一20080629.iar这个库文件。
如果是纯Java应用程序,需把该文件的路径添加到系统环境变量classpath中,否则无法编译;如果是JavaWeb应用,则需要将该库文件部署到应用程序的\WEB—INF\libl|录—Fo图1POI的目录结构三.POI的应用POI提供给用户使用的对象在org.apache.poi.hasf.usermodel包中,主要部分包括Excel对象、样式和格式,还有辅助操作等。
最主要的对象见表1所列。
表1POI的主要对象F■—诩I对象名群一■一”—卿1’辩蔽的&酾1对篆……要HSSFWordbook工作簿IHSSFSheet工作表jHSSFROw表格行HSSFCell单元格(一)POI的简单应用下例中,实现的主要功能为:使用表l中的对象在程序的当前目录下创建一个Excel文件teat.xls,在第一个单元格中写人内容,然后读出该单元格的内容。
springboot中使用java操作poi案例(excel数据写入与导出)
springboot中使⽤java操作poi案例(excel数据写⼊与导出)1.⼯程导⼊依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>RELEASE</version></dependency>这⾥导⼊两个poi的原因是:在excel的表格保存为xls和xlsx两种格式,excel表格早先是xls后来⼜加⼊了xlsx的格式,在下⾯的代码中会有所体现。
2.编写demo@RestController@RequestMapping("/POI")public class POIController {@RequestMapping("/createExcel")public void createExcel(){//HSSFWorkbook wb = new HSSFWorkbook();XSSFWorkbook wb = new XSSFWorkbook();XSSFSheet sheets= wb.createSheet("九九乘法表");for (int i=1;i<=9;i++){XSSFRow row = sheets.createRow(i - 1);for (int j = 1; j<= 9; j++) {XSSFCell cell = row.createCell(j - 1);cell.setCellValue(i+"*"+j+"="+i*j);}}try {FileOutputStream fileOutputStream = new FileOutputStream("d:\\test.xlsx");try {wb.write(fileOutputStream);} catch (IOException e) {e.printStackTrace();}} catch (FileNotFoundException e) {e.printStackTrace();}}}⾥注意的点是在上图创建excel⼯作簿的时候有两种⽅式,如下所⽰:HSSFWorkbook wb = new HSSFWorkbook();//⽣成xls格式的excelXSSFWorkbook wb = new XSSFWorkbook();//⽣成xlsx格式的excel3.poi的整个设计是根据excel表格的特性来做的,⼤致思路是:3.1 通过HSSFWorkbook wb = new HSSFWorkbook()或 XSSFWorkbook wb = new XSSFWorkbook()⽣成excel⼯作簿(wb)3.2 通过创建好的⼯作簿去创建⼯作表(sheet)3.3 通过⼯作表去创建表中的⾏(row),⾏⾥索要填的内容就是单元格的内容(cell)最后,提供了⼯作簿(wb)、⼯作表(sheet)、表中的⾏(row)、⾏内容的单元格(cell)分别的api,⾃⼰稍微摸索⼀下就能。
Java+POI+模板”一:打造复杂Excel报表
Java+POI+模板”⼀:打造复杂Excel报表Java+POI+模板”⼀:打造复杂Excel 报表博客分类:1 设计思路Java 对于Excel 的操作⼀般借助于POI 类库,由于有些报表的表头⽐较复杂,直接⽤POI 控制报表的⽣成⽐较困难,这时可以先制作Excel 报表模板,⽽后再通过Java 调⽤POI 函数将⽤户数据写⼊到Excel 报表模板,最后导出到新的⽬标⽂件即可。
2 设计步骤2.1 初始步骤2.1.1创建Excel 报表模板根据需要设计出Excel 报表,并保存为default.xls。
如下图所⽰。
2.1.2创建ExcelTemplate类Java代码1. /**2. * 该类实现了基于模板的导出3. * 如果要导出序号,需要在excel中定义⼀个标识为sernums4. * 如果要替换信息,需要传⼊⼀个Map,这个map中存储着要替换信息的值,在excel中通过#来开头5. * 要从哪⼀⾏那⼀列开始替换需要定义⼀个标识为datas6. * 如果要设定相应的样式,可以在该⾏使⽤styles完成设定,此时所有此⾏都使⽤该样式7. * 如果使⽤defaultStyls作为表⽰,表⽰默认样式,如果没有defaultStyles使⽤datas⾏作为默认样式8. */9. public class ExcelTemplate {10. private ExcelTemplate() {11.12. }13.14. public static ExcelTemplate getInstance() {15. return et;16. }17. }下⾯是以后要⽤到的⼀些变量和常量Java代码1. /**2. * 数据⾏标识3. */4. public final static String DATA_LINE = "datas";5. /**6. * 默认样式标识7. */8. public final static String DEFAULT_STYLE = "defaultStyles";9. /**10. * ⾏样式标识11. */12. public final static String STYLE = "styles";13. /**14. * 插⼊序号样式标识15. */16. public final static String SER_NUM = "sernums";17. private static ExcelTemplate et = new ExcelTemplate();18.19. private Workbook wb;20.21. private Sheet sheet;23. * 数据的初始化列数24. */25. private int initColIndex;26. /**27. * 数据的初始化⾏数28. */29. private int initRowIndex;30. /**31. * 当前列数32. */33. private int curColIndex;34. /**35. * 当前⾏数36. */37. private int curRowIndex;38. /**39. * 当前⾏对象40. */41. private Row curRow;42. /**43. * 最后⼀⾏的数据44. */45. private int lastRowIndex;46. /**47. * 默认样式48. */49. private CellStyle defaultStyle;50. /**51. * 默认⾏⾼52. */53. private float rowHeight;54. /**55. * 存储某⼀⽅所对于的样式56. */57. private Map<Integer,CellStyle> styles;58. /**59. * 序号的列60. */61. private int serColIndex;2.2 读取excel报表模板的数据Java代码1. /**2. * 1、读取相应的模板⽂档3. */4. public ExcelTemplate readTemplateByClasspath(String path){5. try {6. wb=WorkbookFactory.create(ExcelTemplate.class.getResourceAsStream(path));7. initTemplate();8. } catch (InvalidFormatException e) {9. e.printStackTrace();10. throw new RuntimeException("InvalidFormatException, please check.");11. } catch (IOException e) {12. e.printStackTrace();13. throw new RuntimeException("The template is not exist, please check.");14. }15. return this;16. }17.18. public ExcelTemplate readTemplateByPath(String path){19. try {20. wb=WorkbookFactory.create(new File(path));21. } catch (InvalidFormatException e) {22. e.printStackTrace();23. throw new RuntimeException("InvalidFormatException, please check.");24. } catch (IOException e) {25. e.printStackTrace();26. throw new RuntimeException("The template is not exist, please check.");27. }28. return this;29. }在读取报表模板的时候会初始化模板,记录模板的样式,插⼊数据的位置1. private void initTemplate(){2. sheet=wb.getSheetAt(0);3. initConfigData();4. lastRowIndex = sheet.getLastRowNum();5. curRow=sheet.getRow(curRowIndex);6. }7. /**8. * 循环遍历,找到有datas字符的那个单元,记录initColIndex,initRowIndex,curColIndex,curRowIndex9. * 调⽤initStyles()⽅法10. * 在寻找datas字符的时候会顺便找⼀下sernums,如果有则记录其列号serColIndex;如果没有则调⽤initSer()⽅法,重新循环查找11. */12. private void initConfigData() {13. boolean findData=false;14. boolean findSer = false;15. for(Row row : sheet){16. if(findData) break;17. for(Cell c: row){18. if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;19. String str=c.getStringCellValue().trim();20. if(str.equals(SER_NUM)){21. serColIndex=c.getColumnIndex();22. findSer=true;23. }24. if(str.equals(DATA_LINE)){25. initColIndex=c.getColumnIndex();26. initRowIndex=row.getRowNum();27. curColIndex=initColIndex;28. curRowIndex=initRowIndex;29. findData=true;30. break;31. }32. }33. }34. if(!findSer){35. initSer();36. }37. initStyles();38. }39. /**40. * 初始化序号位置41. */42. private void initSer() {43. for(Row row:sheet) {44. for(Cell c:row) {45. if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;46. String str = c.getStringCellValue().trim();47. if(str.equals(SER_NUM)) {48. serColIndex = c.getColumnIndex();49. }50. }51. }52. }53.54. /**55. * 初始化样式信息56. */57. private void initStyles(){58. styles = new HashMap<Integer, CellStyle>();59. for(Row row:sheet) {60. for(Cell c:row) {61. if(c.getCellType()!=Cell.CELL_TYPE_STRING) continue;62. String str = c.getStringCellValue().trim();63. if(str.equals(DEFAULT_STYLE)) {64. defaultStyle = c.getCellStyle();65. rowHeight=row.getHeightInPoints();66. }67. if(str.equals(STYLE)||str.equals(SER_NUM)) {68. styles.put(c.getColumnIndex(), c.getCellStyle());69. }70. }71. }72. }2.3 新建excel并向其写数据1. public void writeToFile(String filepath){2. FileOutputStream fos=null;3. try {4. fos=new FileOutputStream(filepath);5. wb.write(fos);6. } catch (FileNotFoundException e) {7. e.printStackTrace();8. throw new RuntimeException("写⼊的⽂件不存在"+e.getMessage());9. } catch (IOException e) {10. e.printStackTrace();11. throw new RuntimeException("写⼊数据失败"+e.getMessage());12. } finally{13. if(fos!=null)14. try {15. fos.close();16. } catch (IOException e) {17. e.printStackTrace();18. }19. }20. }2.4 实现Excel公共模板的第⼀步(实现了数据插⼊)下⾯是创建单元格的⽅法,以及重载⽅法Java代码1. public void createCell(String value){2. Cell c =curRow.createCell(curColIndex);3. setCellStyle(c);4. c.setCellValue(value);5. curColIndex++;6. }7. public void createCell(int value) {8. Cell c = curRow.createCell(curColIndex);9. setCellStyle(c);10. c.setCellValue((int)value);11. curColIndex++;12. }13. public void createCell(Date value) {14. Cell c = curRow.createCell(curColIndex);15. setCellStyle(c);16. c.setCellValue(value);17. curColIndex++;18. }19. public void createCell(double value) {20. Cell c = curRow.createCell(curColIndex);21. setCellStyle(c);22. c.setCellValue(value);23. curColIndex++;24. }25. public void createCell(boolean value) {26. Cell c = curRow.createCell(curColIndex);27. setCellStyle(c);28. c.setCellValue(value);29. curColIndex++;30. }31. public void createCell(Calendar value) {32. Cell c = curRow.createCell(curColIndex);33. setCellStyle(c);34. c.setCellValue(value);35. curColIndex++;36. }上⾯的⽅法会调⽤setCellStyle⽅法来设置单元格样式Java代码1. /**2. * 设置某个单元格的样式3. * @param c4. */5. private void setCellStyle(Cell c) {6. if(styles.containsKey(c.getColumnIndex())) {7. c.setCellStyle(styles.get(c.getColumnIndex()));8. } else {9. c.setCellStyle(defaultStyle);10. }11. }createNewRow⽅法⽤于创建新的⾏,新的⾏的位置位于curRowIndex,从curRowIndex到lastRowIndex的所有⾏会⾃动向下移动⼀⾏。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ti i 、“ - -Z  ̄ * np 3 1# l
/ / 产生工作簿对象
H S S et he =w rbo .et he ; 产 生T S F h e set ok ok r e et / ca S 0
作表 对 象
, / 设置 第一个工作表 的名称为f s he, i t et设置字符 rS
p bi s t tn l i =tsxs. E cl u l t i Sr gxs l ” t l1/ xe c ac i F e e . 『/ 文件的
名称 p bis t ima (tn g[{ ul ac o i Sr g rs ) c t iv d n i a ]
t{ r y
可以用纯Jy代码来读取、 aa 写入、 修改E cl xe 文件。
二 P ! 用配 置 O应
PI O 包可以在A ah p ce官方 网站下载 。 下载 后, 解压
宿得 到如 图 1 所示 的 目录结 构 。 应 用 中主要 用p i3 一 在 o . _ 1
p bi ls rae x eR p r { u l cas e tE c l e ot c C
/ / 往第一个单元格中写入信息
clsteV le” 试 消 息” e. Cl a ( 1e l u 测 ) ;
FlO tuS em u =n wFlO tuSra xsi ) i up tt a f t e i up tt m( Fl; e r O e e l e
cls C l a e” 户编码 ” e . te V l ( 1e l u 用 ) ; f 二 } 第 cl=r . et e (hr1 e l o c a C l( ot) w r e ls ) ;
Jkr O 是 aah 的子 项 目, a at P I p ce a 目标是 处 理 o 2 l 对 e
象。 它提供了一组操纵widw ̄档的Jv P 。目 比 nos aaA I 前
菠成熟 的 是 H S ( or l S raS et o t接 口, S F H r b ped he Fr ) ie ma 处理 MSE cl9 — 0 2 对 象 。 通 过H S , xe (7 2 0 ) S F 开发 人 员
HS F el el o .rae els ot0; S C lcl:rw ce tC l( r ) (h ) clst ely eHS F e1 E L T E S I G ; e1 eC l p ( S C l C L _ YP — TR N ) . T .
clst n o igHS F e1 N OD N — T '1) e1 eE c dn ( S C lE C I G U F 6: . . _
洲
A
A coM M
R
言
I7 4
目
嘲嘲 ∞ ∞…
clst ely eHS F e . E L T E S RI 1 e1 eC l p ( S C lC L _ YP — T NG ; . T 1 c lstn 0 igHS F e1 C D N — T _ 6; e1 eE c dn ( S C lEN O I G U F- ) . . l
编 码 为U F 1 T _6
wo kb o S t h e Na e 0,” is S e t , r o k.e S e t m f f t b e ” r
HS FW 0 k 0 k ENCODI S rb 0 . NG U F 1) T 一 6;
—
, / 产生一行, 且为第一行
图1 P I 目 结构 0的 录
表的应 用 。
还有辅助操作等。 最主要的对象 见表1 所列。
表 1 P I 主要对象 Of i  ̄ -
一
Pj 介 c简 I
( P I 一) O 的简单应用 下例 中, 实现 的主要 功能为: 用表 l 使 中的对 象在 程 序的当前 目录下创建一个E cl xe 文件t t l, e .s 在第一个 sx 单元格中写入内容, 然后读出该单元格 的内容。 主要程 序部分为:
HS F o w=s et rae W(h r 0: S R wr o h e. e trO ( ot ) c s )
, / 产生该行 的第一个单元格
三、 O的应 用 PI
P I 供给用户使用的对象在ogaa h .o hs O提 r. c e i sf p p.
sr oe e dl m 包中, 主要部分包括E cl xe对象、 样式和格式,
HS F r b 0 o k o k= n w HS F r b 0 f S W0 k 0 k w r b o e S k o k) :
? A 一 0 8 6 9 a这个库文件。 I L 2 0 0 2 .r N j 如果是纯Jv应用程 aa 芋, 需把该 文件 的路 径添加到 系统 环境变 量cas ah lsp t 中 否则无法编译 ; , 如果是Jv b aa We应用, 则需要将该库 艾 件部署到应用程序的\ B I Fl 目 WE —N \b 录 i
软 栏 粱E 件服 务 目 目 春m 编 丽a ■ 辑 — } lቤተ መጻሕፍቲ ባይዱ -
期 躺 …
l i a fi0 @ 6 o z : ng i 5 5 1 3 c m
,
■ 中国 人 民银 行 南 昌中心支 行 中国 人 民银 行上 饶 市 中心支 行
王 逞 吴 朱 勇±
报 表输出是Jv应用开发 巾经常涉及的内容, aa 而一 睃的报表往往缺乏通 用性 。 不方便用户进行个性 化编 阻。 aa Jv程序 南于其跨平台特性, 不能直接操纵E cl xe。 鉴于此 , 本文探讨—下P I O 实现Jv程 序中操作E cl aa xe报