主题:Apache POI HSSF读写Excel总结
POI设置EXCEL单元格格式的操作小结
POI中可能会用到一些需要设置EXCEL单元格格式的操作小结:先获取工作薄对象:Java代码HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet();HSSFCellStyle setBorder = wb.createCellStyle();HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet();HSSFCellStyle setBorder = wb.createCellStyle();一、设置背景色:Java代码setBorder.setFillForegroundColor((short) 13);// 设置背景色setBorder.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); setBorder.setFillForegroundColor((short) 13);// 设置背景色setBorder.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);二、设置边框:Java代码setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框setBorder.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框setBorder.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框setBorder.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框setBorder.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框三、设置居中:Java代码setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中setBorder.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中四、设置字体:Java代码HSSFFont font = wb.createFont();font.setFontName("黑体");font.setFontHeightInPoints((short) 16);//设置字体大小HSSFFont font2 = wb.createFont();font2.setFontName("仿宋_GB2312");font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示font2.setFontHeightInPoints((short) 12);setBorder.setFont(font);//选择需要用到的字体格式HSSFFont font = wb.createFont();font.setFontName("黑体");font.setFontHeightInPoints((short) 16);//设置字体大小HSSFFont font2 = wb.createFont();font2.setFontName("仿宋_GB2312");font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示font2.setFontHeightInPoints((short) 12);setBorder.setFont(font);//选择需要用到的字体格式五、设置列宽:Java代码sheet.setColumnWidth(0, 3766); //第一个参数代表列id(从0开始),第2个参数代表宽度值sheet.setColumnWidth(0, 3766); //第一个参数代表列id(从0开始),第2个参数代表宽度值六、设置自动换行:Java代码setBorder.setWrapText(true);//设置自动换行setBorder.setWrapText(true);//设置自动换行七、合并单元格:Java代码Region region1 = new Region(0, (short) 0, 0, (short) 6);//参数1:行号参数2:起始列号参数3:行号参数4:终止列号sheet.addMergedRegion(region1);Region region1 = new Region(0, (short) 0, 0, (short) 6);//参数1:行号参数2:起始列号参数3:行号参数4:终止列号sheet.addMergedRegion(region1);附一个完整的例子:Java代码package .util;import ermodel.HSSFCellStyle;import ermodel.HSSFFont;import ermodel.HSSFRichTextString;import ermodel.HSSFWorkbook;import ermodel.HSSFSheet;import ermodel.HSSFRow;import ermodel.HSSFCell;import org.apache.poi.hssf.util.CellRangeAddress;import org.apache.poi.hssf.util.Region;import ermodel.CellStyle;import java.io.FileOutputStream;import javax.servlet.http.HttpServlet;public class CreateXL extends HttpServlet {/** Excel 文件要存放的位置,假定在D盘下*/public static String outputFile = "c:\\test.xls";private void cteateCell(HSSFWorkbook wb, HSSFRow row, short col, String val) { HSSFCell cell = row.createCell(col);// cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellV alue(val);HSSFCellStyle cellstyle = wb.createCellStyle();cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);cell.setCellStyle(cellstyle);}public static void main(String argv[]) {try {// 创建新的Excel 工作簿HSSFWorkbook workbook = new HSSFWorkbook();// 设置字体HSSFFont font = workbook.createFont();// font.setColor(HSSFFont.COLOR_RED);font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);font.setFontHeightInPoints((short) 14);// HSSFFont font2 = workbook.createFont();// font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// font.setFontHeightInPoints((short)14);// 设置样式HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setFont(font);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// HSSFCellStyle cellStyle2= workbook.createCellStyle();// cellStyle.setFont(font2);// cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 在Excel工作簿中建一工作表,其名为缺省值// 如要新建一名为"月报表"的工作表,其语句为:HSSFSheet sheet = workbook.createSheet("月报表");CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0,11);sheet.addMergedRegion(cellRangeAddress);//第一行// 在索引0的位置创建行(最顶端的行)HSSFRow row = sheet.createRow(0);// 在索引0的位置创建单元格(左上端)HSSFCell cell = row.createCell(0);// 定义单元格为字符串类型cell.setCellType(HSSFCell.CELL_TYPE_STRING);cell.setCellStyle(cellStyle);// 在单元格中输入一些内容cell.setCellV alue(new HSSFRichTextString("北京亿卡联科技发展有限公司小区门禁维修月报表"));//第二行cellRangeAddress = new CellRangeAddress(1, 1, 3, 6);sheet.addMergedRegion(cellRangeAddress);row = sheet.createRow(1);HSSFCell datecell = row.createCell(3);datecell.setCellType(HSSFCell.CELL_TYPE_STRING); datecell.setCellStyle(cellStyle);datecell.setCellV alue("时间间隔xxxxx");cellRangeAddress = new CellRangeAddress(1, 1, 9, 10);sheet.addMergedRegion(cellRangeAddress);row.createCell(9).setCellV alue("单位:元");//第三行row=sheet.createRow(2);row.createCell(0).setCellV alue("一、");row.createCell(1).setCellV alue("基本资料");//第4行row=sheet.createRow(3);row.createCell(1).setCellV alue("小区名称:"); cellRangeAddress=new CellRangeAddress(3,3,2,11); sheet.addMergedRegion(cellRangeAddress);row.createCell(2).setCellV alue("xxxxx");//第5行row=sheet.createRow(4);row.createCell(1).setCellV alue("座落地点:"); cellRangeAddress=new CellRangeAddress(4,4,2,11); sheet.addMergedRegion(cellRangeAddress);row.createCell(2).setCellV alue("xxxxx");//第6行row=sheet.createRow(5);row.createCell(1).setCellV alue("建成年月:"); cellRangeAddress=new CellRangeAddress(5,5,2,4); sheet.addMergedRegion(cellRangeAddress);row.createCell(2).setCellV alue("年月日:xxxxx"); row.createCell(5).setCellV alue("联系人"); cellRangeAddress=new CellRangeAddress(5,5,6,8); sheet.addMergedRegion(cellRangeAddress);row.createCell(6).setCellV alue("XXX");row.createCell(9).setCellV alue("电话"); cellRangeAddress=new CellRangeAddress(5,5,10,11); sheet.addMergedRegion(cellRangeAddress);row.createCell(10).setCellV alue("XXX");//第7行row=sheet.createRow(6);row.createCell(1).setCellV alue("住户:");row.createCell(2).setCellV alue("(XX)");row.createCell(3).setCellV alue("(户)"); cellRangeAddress=new CellRangeAddress(6,6,4,5); sheet.addMergedRegion(cellRangeAddress);row.createCell(4).setCellV alue("共计()"); row.createCell(6).setCellV alue("幢"); cellRangeAddress=new CellRangeAddress(6,6,7,8); sheet.addMergedRegion(cellRangeAddress);row.createCell(7).setCellV alue("发卡张数"); cellRangeAddress=new CellRangeAddress(6,6,9,10); sheet.addMergedRegion(cellRangeAddress);row.createCell(9).setCellV alue("xxxx");//第9行row=sheet.createRow(8);row.createCell(0).setCellV alue("二、"); cellRangeAddress=new CellRangeAddress(8,8,1,2); sheet.addMergedRegion(cellRangeAddress);row.createCell(1).setCellV alue("维修用材料台账"); row.createCell(6).setCellV alue("三、"); cellRangeAddress=new CellRangeAddress(8,8,7,9); sheet.addMergedRegion(cellRangeAddress);row.createCell(7).setCellV alue("维修工时记录");//第10行row=sheet.createRow(9);row.createCell(0).setCellV alue("日期");row.createCell(1).setCellV alue("维修事项");row.createCell(2).setCellV alue("材料清单");row.createCell(3).setCellV alue("数量");row.createCell(4).setCellV alue("单价");row.createCell(5).setCellV alue("材料金额");row.createCell(7).setCellV alue("日期");row.createCell(8).setCellV alue("技工");row.createCell(9).setCellV alue("工时数");row.createCell(10).setCellV alue("单价");row.createCell(11).setCellV alue("工时金额");//填充数据for (int i = 0; i < 10; i++) {row=sheet.createRow(9+i+1);row.createCell(0).setCellV alue("日期");row.createCell(1).setCellV alue("维修事项");row.createCell(2).setCellV alue("材料清单");row.createCell(3).setCellV alue("数量");row.createCell(4).setCellV alue("单价");row.createCell(5).setCellV alue("材料金额");row.createCell(7).setCellV alue("日期");row.createCell(8).setCellV alue("技工");row.createCell(9).setCellV alue("工时数");row.createCell(10).setCellV alue("单价");row.createCell(11).setCellV alue("工时金额");}//第n+10行row=sheet.createRow(9+10+1);//cellRangeAddress=new CellRangeAddress(19,19,0,4);//sheet.addMergedRegion(cellRangeAddress);row.createCell(0).setCellV alue("累计:");row.createCell(1).setCellV alue("xxx");row.createCell(7).setCellV alue("累计:");row.createCell(8).setCellV alue("xxx");// 新建一输出文件流FileOutputStream fOut = new FileOutputStream(outputFile); // 把相应的Excel 工作簿存盘workbook.write(fOut);fOut.flush();// 操作结束,关闭文件fOut.close();System.out.println("文件生成...");} catch (Exception e) {System.out.println("已运行xlCreate() : " + e);}}}。
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使用Apache.POI中HSSFWorkbook导出到Excel的实现方法
Java使⽤Apache.POI中HSSFWorkbook导出到Excel的实现⽅法使⽤Apache.POI中HSSFWorkbook导出到Excel,具体内容如下所⽰:1.引⼊Poi依赖(3.12)依赖如下:<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.12</version></dependency>2.创建实体类(User.java)package com.kd.nm.entity.pojo;/*** 实体类(User)** author ⼩⾠哥哥*/public class User {// ⽤户编号private String userNo;// ⽤户名称private String userName;// 年龄private String age;// ⽆参构造public User() {}// 有参构造public User(String userNo, String userName, String age) {erNo = userNo;erName = userName;this.age = age;}// get与set⽅法进⾏封装public String getUserNo() {return userNo;}public void setUserNo(String userNo) {erNo = userNo;}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}// 重新toString⽅法@Overridepublic String toString() {return "User{" +"userNo='" + userNo + '\'' +", userName='" + userName + '\'' +", age='" + age + '\'' +'}';}}3.Excel相关⼯具类(ExcelUtil、ReflectUtil)package com.kd.nm.util;import java.util.ArrayList;import java.util.List;import java.util.Map;import ermodel.*;/*** Description : Excel相关⼯具类** @author: ⼩⾠哥哥**/public class ExcelUtil {/*** ⽣成excel表格* @param heads 表头内容* @param data 数据内容* @return*/public static HSSFWorkbook creatExcel(Map<String, String> heads, List data) {// 声明⼀个⼯作薄HSSFWorkbook workbook = new HSSFWorkbook();// ⽣成⼀个表格HSSFSheet sheet = workbook.createSheet();// ⽣成标题⾏样式HSSFCellStyle headStyle = creatStyle(workbook, (short) 14);// ⽣成表格内容样式HSSFCellStyle bodyStyle = creatStyle(workbook, (short) 10);// 标题元素List<String> keys = new ArrayList<String>(heads.keySet());// 像素单位short px = 1000;// 设置列宽for (int columnIndex = 0; columnIndex < keys.size(); columnIndex++) {sheet.setColumnWidth(columnIndex, 6 * px);}// ⽣成表格for (int rowNum = 0; rowNum <= data.size(); rowNum++) {// 创建⾏HSSFRow row = sheet.createRow(rowNum);for (int cellNum = 0; cellNum < keys.size(); cellNum++) {// 创建列HSSFCell cell = row.createCell(cellNum);// 标题if (rowNum == 0) {cell.setCellStyle(headStyle);cell.setCellValue(heads.get(keys.get(cellNum)));} else { // 内容cell.setCellStyle(bodyStyle);// 通过反射获取cell.setCellValue(ReflectUtil.getValue(keys.get(cellNum), data.get(rowNum - 1))); }}}return workbook;}/*** ⽣成样式* @param workbook* @param size* @return*/public static HSSFCellStyle creatStyle(HSSFWorkbook workbook, short size) { HSSFCellStyle style = workbook.createCellStyle();style.setAlignment((HSSFCellStyle.ALIGN_CENTER));style.setVerticalAlignment((HSSFCellStyle.VERTICAL_CENTER));HSSFFont font = workbook.createFont();font.setFontHeightInPoints(size);font.setFontName("微软雅⿊");style.setFont(font);style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);return style;}}package com.kd.nm.util;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.ReflectionUtils;import java.beans.PropertyDescriptor;import ng.reflect.Method;/*** 反射⼯具包** @author: ⼩⾠哥哥*/public class ReflectUtil {private static final Logger logger = LoggerFactory.getLogger(ReflectUtil.class); public static String getValue(String key, Object obj) {String value = "";try {// 获取当前属性PropertyDescriptor pd = new PropertyDescriptor(key, obj.getClass());// 获取get⽅法Method getMd = pd.getReadMethod();value = getMd.invoke(obj).toString();} catch (Exception e) {logger.error("获取内容失败!");e.printStackTrace();}return value;}public static void setValue(String key, String value, Object obj) {try {// 获取当前属性PropertyDescriptor pd = new PropertyDescriptor(key, obj.getClass());// 获取set⽅法Method writeMd = pd.getWriteMethod();writeMd.invoke(obj, value);} catch (Exception e) {logger.error("设置内容失败!");e.printStackTrace();}}}4.后端控制器代码@RequestMapping(value = "/exportExcel",method = RequestMethod.GET,produces = "application/json")public void exportExcel(HttpServletResponse httpServletResponse) throws IOException {// 表头内容(可在前端设置,通过参数传递进来) Key是实体类的属性值,value是表头的lableMap<String,String> head = new HashMap<>();head.put("userNo","⽤户编号");head.put("userName","⽤户名称");head.put("age","年龄");// 表格数据内容,模拟数据库查询出来的数据List<User> data = new ArrayList<>();data.add(new User("1","⼩⾠哥哥","18"));data.add(new User("2","⼩猪妹妹","18"));data.add(new User("3","⼤猪哥哥","18"));// ⽣成⼯作薄HSSFWorkbook hssfWorkbook = ExcelUtil.creatExcel(head, data);// 定义⽂件名String fileName = "导出Excel表格";httpServletResponse.setHeader("Cache-Control", "max-age=0");httpServletResponse.setContentType("application/vnd.ms-excel");httpServletResponse.addHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes("gb2312"),"ISO-8859-1") + ".xls");OutputStream outputStream = httpServletResponse.getOutputStream();hssfWorkbook.write(outputStream);outputStream.flush();outputStream.close();}5.访问映射地址接⼝访问:到此这篇关于Java使⽤Apache.POI中HSSFWorkbook导出到Excel的实现⽅法的⽂章就介绍到这了,更多相关Apache.POI中HSSFWorkbook导出到Excel内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
poi数据使用
poi数据使用POI(Apache POI)是一个用于操作Microsoft Office格式文件(如doc、xls、ppt等)的Java API。
它提供了一组类和方法,使开发人员可以轻松地读取、写入和操作Office文档中的数据。
本文将介绍如何使用POI来处理poi数据。
二、POI数据读取1. 导入POI库首先,我们需要在项目中导入POI库。
可以下载POI的jar文件,然后将其添加到项目的classpath中。
2. 创建工作簿和工作表使用POI来读取poi数据之前,我们需要创建一个工作簿和一个工作表对象。
可以使用HSSFWorkbook和HSSFSheet类来分别代表工作簿和工作表。
3. 读取数据使用POI的API方法,我们可以逐行或逐列读取poi数据。
可以使用HSSFRow和HSSFCell类来分别代表行和单元格。
通过遍历行和列的方式,可以获取到相应的数据。
三、POI数据写入1. 创建工作簿和工作表与数据读取类似,我们首先需要创建一个工作簿和一个工作表对象。
可以使用HSSFWorkbook和HSSFSheet类来分别代表工作簿和工作表。
2. 写入数据使用POI的API方法,我们可以将数据写入到指定的单元格中。
可以使用HSSFRow和HSSFCell类来分别代表行和单元格。
可以通过设置单元格的值来进行数据的写入操作。
四、POI数据操作注意事项1. 数据格式转换在进行POI数据读取或写入操作时,需要注意数据的格式转换。
例如,将数字类型的数据转换为字符串,或将字符串类型的数据转换为日期类型。
2. 数据校验在写入数据之前,我们需要进行数据校验,确保所写入的数据符合需求。
例如,对于字符串类型的数据,可以进行长度、格式等校验。
3. 数据样式设置为了使POIpoi数据的呈现更加美观,我们可以设置数据的样式。
可以使用HSSFCellStyle类来设置单元格的字体、背景色、边框等样式。
本文介绍了如何使用POI对poi数据进行读取和写入操作。
JAVA使用POI(XSSFWORKBOOK)读取EXCEL文件过程解析
JAVA使⽤POI(XSSFWORKBOOK)读取EXCEL⽂件过程解析经过⼀番搜索发现,java操纵excel⽂件常⽤的有jxl和poi两种⽅式,孰好孰坏看⾃⼰需求⽽定。
其中最主要的区别在于jxl不⽀持.xlsx,⽽poi⽀持.xlsx这⾥介绍的使⽤poi⽅式(XSSFWorkbook),实际上poi提供了HSSFWorkbook和XSSFWorkbook两个实现类。
区别在于HSSFWorkbook是针对.xls⽂件,XSSFWorkbook是针对.xslx⽂件。
⾸先明确⼀下基本概念: 先创建⼀个⼯作簿,⼀个⼯作簿可以有多个⼯作表,⼀个⼯作表可以有多个⾏,⼀个⾏可以有多个单元格 ⼯作簿 >>>>>>>>XSSFWorkbook ⼯作表 >>>>>>>>XSSFSheet ⾏ >>>>>>>>XSSFRow 单元格 >>>>>>>>XSSFCell下图为创建的student.xlsx的内容:读取student.xlsx⽂件代码:package com.zjk.testexcel;import ermodel.*;import java.io.FileInputStream;import java.io.IOException;/*** @Auther: zjk* @Date: 2019/8/30* @Description:*/public class TestExcel1 {public static void main(String[] args) {try {//创建⼯作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("D:\\test-excel\\student.xlsx"));System.out.println("xssfWorkbook对象:" + xssfWorkbook);//读取第⼀个⼯作表(这⾥的下标与list⼀样的,从0开始取,之后的也是如此)XSSFSheet sheet = xssfWorkbook.getSheetAt(0);System.out.println("sheet对象:" + sheet);//获取第⼀⾏的数据XSSFRow row = sheet.getRow(0);System.out.println("row对象:" + row);//获取该⾏第⼀个单元格的数据XSSFCell cell0 = row.getCell(0);System.out.println("cello对象:" + cell0);} catch (IOException e) {e.printStackTrace();}}}控制台输出结果:可以发现具体到⾏对象时,就解析成xml⽂件了xssfWorkbook对象: Name: /xl/workbook.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xmlsheet对象: Name: /xl/worksheets/sheet1.xml - Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xmlrow对象: <xml-fragment r="1" spans="1:4" xmlns:r="/officeDocument/2006/relationships" xmlns:xdr="/drawingml/2006/spreadsheetDrawing" xmlns:x14="/office/spre <main:c r="A1" t="s"> <main:v>0</main:v> </main:c> <main:c r="B1" t="s"> <main:v>1</main:v> </main:c> <main:c r="C1" t="s"> <main:v>2</main:v> </main:c> <main:c r="D1" t="s"><main:v>3</main:v></main:c></xml-fragment>cello对象:姓名以上可以实现了读取某⾏某单元格的数据,那么接下来就该读取整个表的所有数据了:package com.zjk.testexcel;import ermodel.XSSFCell;import ermodel.XSSFRow;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;import java.io.FileInputStream;import java.io.IOException;/*** @Auther: zjk* @Date: 2019/8/30* @Description:*/public class TestExcel2 {public static void main(String[] args) {try {//创建⼯作簿XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("D:\\test-excel\\student.xlsx"));System.out.println("xssfWorkbook对象:" + xssfWorkbook);//读取第⼀个⼯作表XSSFSheet sheet = xssfWorkbook.getSheetAt(0);System.out.println("sheet对象:" + sheet); //获取最后⼀⾏的num,即总⾏数。
hssfsheet和worksheet
hssfsheet和worksheetHSSFSheet和Worksheet是两种用于处理电子表格的概念。
HSSFSheet 是Apache POI库中的一部分,用于处理Excel文件的高级Java API。
而Worksheet是微软Excel中的一个术语,表示一个电子表格中的单个工作表。
在本篇文章中,我们将逐步回答有关HSSFSheet和Worksheet的问题,了解它们的定义、功能和如何使用它们进行电子表格的操作。
第一部分:HSSFSheet的定义和功能(700字)HSSFSheet是Apache POI库中的一个类,它用于表示Excel文件中的一个工作表。
它提供了一系列方法和属性,用于对工作表进行操作。
以下是HSSFSheet的主要功能:1. 创建和删除工作表:使用HSSFSheet,我们可以创建新的工作表,也可以删除现有的工作表。
例如,我们可以使用createSheet()方法创建一个新的工作表,使用removeSheetAt()方法删除现有的工作表。
2. 获取和设置单元格的值:HSSFSheet提供了一系列的getCell()方法,用于获取特定单元格的值。
我们还可以使用setCellValue()方法设置单元格的值。
这使我们可以轻松地读取和修改工作表中的数据。
3. 设置单元格样式:HSSFSheet允许我们设置单元格的样式,包括字体、颜色、边框等。
我们可以使用createCellStyle()方法创建一个新的单元格样式,并使用setCellStyle()方法将其应用于特定的单元格。
4. 插入和删除行列:HSSFSheet允许我们在工作表中插入和删除行和列。
我们可以使用insertRow()和removeRow()方法插入和删除行,使用shiftRows()方法移动行和列的位置。
5. 合并和拆分单元格:HSSFSheet提供了mergeCells()和splitCell()方法,用于合并和拆分单元格。
关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结
关于poi导出excel三种⽅式HSSFWorkbook,SXSSFWorkbook,csv的总结poi导出excel最常⽤的是第⼀种⽅式HSSFWorkbook,不过这种⽅式数据量⼤的话会产⽣内存溢出问题,SXSSFWorkbook是⼀种⼤数据量导出格式,csv是另⼀种excel导出的⼀种轻快的实现。
先介绍⼀下这三种格式的特点1 HSSFWorkbook excel⽂件底层是txt实现,我们经常见到的excel都是这种实现的。
2 SXSSFWorkbook excel⽂件底层是xml实现,同样的数据量,⼤约是第⼀种的1/6-1/4之间3 csv 这个⽐较新潮,数据量应该更⼩,可以百度。
⼀ HSSFWorkbook 实现Map<String, Object> dataMap = service.AssignMiddleExcel(page);ObjectExcelView erv = new ObjectExcelView("逾期客户表"); //执⾏excel操作mv = new ModelAndView(erv,dataMap);dataMap 是个map ,包含两个键值对⼀个是标题列Map<String,Object> dataMap = new HashMap<String,Object>();List<String> titles = new ArrayList<String>();titles.add("借款⼈姓名"); //1titles.add("⾝份证号"); //2titles.add("借款⼈⼿机号");dataMap.put("titles", titles);这是标题列vpd是个mapvpd.put("var1", userList.get(i).getString("realName")); //1vpd.put("var2", userList.get(i).getString("contIdCard")); //2vpd.put("var3", userList.get(i).getString("telephone")); //3List<PageData> varList = new ArrayList<PageData>();PageData就是个HashMapvarList.add(vpd);dataMap.put("varList", varList);这就是dataMap的由来public class ObjectExcelView extends AbstractExcelView{private String fileName;public ObjectExcelView(){}public ObjectExcelView(String fileName){this.fileName = fileName;}@Overrideprotected void buildExcelDocument(Map<String, Object> model,HSSFWorkbook workbook, HttpServletRequest request,HttpServletResponse response) throws Exception {// TODO Auto-generated method stub//String fileName = "逾期客户表-待催收";HSSFSheet sheet;HSSFCell cell;response.setContentType("application/x-download");//下⾯三⾏是关键代码,处理乱码问题response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename="+new String(fileName.getBytes("gbk"), "iso8859-1")+".xls");sheet = workbook.createSheet("sheet1");List<String> titles = (List<String>) model.get("titles");int len = titles.size();HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);HSSFFont headerFont = workbook.createFont(); //标题字体headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerFont.setFontHeightInPoints((short)11);headerStyle.setFont(headerFont);short width = 20,height=25*20;sheet.setDefaultColumnWidth(width);for(int i=0; i<len; i++){ //设置标题String title = titles.get(i);cell = getCell(sheet, 0, i);cell.setCellStyle(headerStyle);setText(cell,title);}sheet.getRow(0).setHeight(height);HSSFCellStyle contentStyle = workbook.createCellStyle(); //内容样式contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);List<PageData> varList = (List<PageData>) model.get("varList");int varCount = varList.size();for(int i=0; i<varCount; i++){PageData vpd = varList.get(i);for(int j=0;j<len;j++){String varstr = vpd.getString("var"+(j+1)) != null ? vpd.getString("var"+(j+1)) : "";cell = getCell(sheet, i+1, j);cell.setCellStyle(contentStyle);setText(cell,varstr);}}}}⼆ SXSSFWorkbook@RequestMapping("/excel111")public Object exportExcel(Page page,HttpServletRequest request,HttpServletResponse response){ PageData pd = new PageData();pd = this.getPageData();try{//检索条件===========PageData pageData = service.setPdWithTrim(this.getPageData());page.setPd(pageData);//检索条件===========Map<String, Object> dataMap = service.AssignMiddleExcel(page);OutputStream outputStream = response.getOutputStream();String sheetName = "逾期客户表";List<String> list = (List<String>)dataMap.get("titles");String[] headers = new String[list.size()];for(int i = 0;i<list.size();i++){headers[i]=list.get(i);}List<Object[]> dataList = new ArrayList<>();List<PageData> varList = new ArrayList<PageData>();varList = (List<PageData>)dataMap.get("varList");varList.forEach(e ->{List<Object> ObjectList = new ArrayList<>();for(int i=0;i<headers.length;i++){ObjectList.add(e.get("var"+(i+1))==null?null:e.getString("var"+(i+1)));}/* for (Object v : e.values()) {ObjectList.add(v);}*/Object[] objarr = new Object[ObjectList.size()];for(int i = 0;i<ObjectList.size();i++){objarr[i] = ObjectList.get(i);}dataList.add(objarr);});ExportUtil exportUtil = new ExportUtil(sheetName,headers,dataList);//SXSSFWorkbook ⼤批量数据导出SXSSFWorkbook workBook = exportUtil.export();// 如果⽂件名有中⽂,必须URL编码String fileName1 = URLEncoder.encode(sheetName, "UTF-8");// response.reset();// response.setContentType("application/force-download");response.setContentType("application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment; filename=" + fileName1+".xls");workBook.write(outputStream);workBook.close();outputStream.flush();outputStream.close();//ObjectExcelView erv = new ObjectExcelView("逾期客户表"); //执⾏excel操作//mv = new ModelAndView(erv,dataMap);} catch(Exception e){logger.error(e.toString(), e);}return new Object();}package com.fh.controller.assign_out;import java.util.ArrayList;import java.util.List;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFFont;import ermodel.HSSFRichTextString;import org.apache.poi.hssf.util.HSSFColor;import ermodel.Cell;import ermodel.CellStyle;import ermodel.Font;import ermodel.Row;import ermodel.Sheet;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.SXSSFWorkbook;import ermodel.XSSFCellStyle;import ermodel.XSSFFont;import org.springframework.util.StringUtils;/*** Created by dell、 on 2017/10/12.*/public class ExportUtil {private SXSSFWorkbook wb = null;//⼤数据导出格式private Sheet sheet = null;private String sheetName;private String[] headers;//表头字段private List<Object[]> dataList = new ArrayList<Object[]>();//表内容数据//构造public ExportUtil(SXSSFWorkbook wb, Sheet sheet) {this.wb = wb;this.sheet = sheet;}//构造public ExportUtil(String sheetName, String[] headers, List<Object[]> dataList) { this.dataList = dataList;this.headers = headers;this.sheetName = sheetName;}//不知道做什么public void setRegionStyle(CellRangeAddress region, XSSFCellStyle cs) {int toprowNum = region.getFirstRow();for (int i = toprowNum; i <= region.getLastRow(); i++) {SXSSFRow row = (SXSSFRow) sheet.getRow(i);for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {SXSSFCell cell = (SXSSFCell) row.getCell(j);cell.setCellStyle(cs);}}}// 设置表头的单元格样式public CellStyle getHeadStyle() {// 创建单元格样式CellStyle cellStyle = wb.createCellStyle();// 设置单元格的背景颜⾊为淡蓝⾊cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);// 设置填充字体的样式cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);// 设置单元格居中对齐cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 设置单元格垂直居中对齐cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 创建单元格内容显⽰不下时⾃动换⾏cellStyle.setWrapText(false);// 设置单元格字体样式XSSFFont font = (XSSFFont) wb.createFont();// font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗font.setFontName("宋体");// 设置字体的样式font.setFontHeight(14);// 设置字体的⼤⼩cellStyle.setFont(font);// 将字体填充到表格中去// 设置单元格边框为细线条(上下左右)cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);return cellStyle;}// 设置表体的单元格样式public CellStyle getBodyStyle() {// 创建单元格样式CellStyle cellStyle = wb.createCellStyle();// 设置单元格居中对齐cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 设置单元格居中对齐cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 创建单元格内容不显⽰⾃动换⾏cellStyle.setWrapText(false);// 设置单元格字体样式XSSFFont font = (XSSFFont) wb.createFont();font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗font.setFontName("宋体");// 设置字体font.setFontHeight(12);// 设置字体的⼤⼩cellStyle.setFont(font);// 将字体添加到表格中去// 设置单元格边框为细线条cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);return cellStyle;}//似乎没⽤到public Cell setHeadStyle(String[] titles) {Cell cell = null;CellStyle headStyle = getHeadStyle();Row headRow = sheet.createRow(0);// 构建表头for (int i = 0; i < titles.length; i++) {cell = headRow.createCell(i);cell.setCellStyle(headStyle);cell.setCellValue(titles[i]);}return cell;}/** 导出数据*/public SXSSFWorkbook export() throws Exception {// String nsheetName = new String(sheetName.getBytes("UTF-8"));/** response.setCharacterEncoding("utf-8");* response.setContentType("application/x-msdownload");* response.setHeader("Content-disposition", "attachment; filename=" +* sheetName + ".xlsx");// 组装附件名称和格式*/Integer rowaccess = 1000;// 内存中缓存记录⾏数,以免内存溢出SXSSFWorkbook workbook = new SXSSFWorkbook(rowaccess);try {Sheet sheet = workbook.createSheet(sheetName);// 产⽣表格标题⾏Row titleRow = sheet.createRow(0);Cell cellTiltle = titleRow.createCell(0);CellStyle columnTopStyle = this.getColumnTopStyle(workbook);// 获取列头样式对象 sheet.setDefaultColumnWidth(100);sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (headers.length - 1)));cellTiltle.setCellStyle(columnTopStyle);cellTiltle.setCellValue(sheetName);Cell cell = null;CellStyle headStyle = this.getHeadStyle(workbook);// 定义所需列数int columnNum = headers.length;Row headRow = sheet.createRow(2); // 在索引2的位置创建⾏(最顶端的⾏开始的第⼆⾏)//表头for (int n = 0; n < columnNum; n++) {Cell cellRowName = headRow.createCell(n); // 创建列头对应个数的单元格cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型 HSSFRichTextString text = new HSSFRichTextString(headers[n]);cellRowName.setCellValue(headers[n]); // 设置列头单元格的值cellRowName.setCellStyle(headStyle); // 设置列头单元格样式sheet.setColumnWidth(n,256*20);}CellStyle bodyStyle = this.getBodyStyle(workbook);// 表体数据for (int i = 0; i < dataList.size(); i++) {Object[] obj = dataList.get(i);Row row = sheet.createRow(i + 3);// 创建所需的⾏数for (int j = 0; j < obj.length; j++) {cell = row.createCell(j);String str = String.valueOf(StringUtils.isEmpty(obj[j]) ? "" : obj[j]);cell.setCellValue(str); // 单元格的值cell.setCellStyle(bodyStyle); // 单元格的样式}}} catch (Exception e) {e.printStackTrace();}return workbook;}// 设置表头的单元格样式public CellStyle getHeadStyle(SXSSFWorkbook workbook) {// 创建单元格样式CellStyle cellStyle = workbook.createCellStyle();// 设置单元格的背景颜⾊为淡蓝⾊cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);// 设置填充字体的样式cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);// 设置单元格居中对齐cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 设置单元格垂直居中对齐cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// cellStyle.setShrinkToFit(true);// 创建单元格内容显⽰不下时⾃动换⾏//cellStyle.setWrapText(true);// 设置单元格字体样式XSSFFont font = (XSSFFont) workbook.createFont();// font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗font.setFontName("宋体");// 设置字体的样式font.setFontHeight(12);// 设置字体的⼤⼩cellStyle.setFont(font);// 将字体填充到表格中去// 设置单元格边框为细线条(上下左右)cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);return cellStyle;}// 设置表体的单元格样式public CellStyle getBodyStyle(SXSSFWorkbook workbook) {// 创建单元格样式CellStyle cellStyle = workbook.createCellStyle();// 设置单元格居中对齐cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 设置单元格居中对齐cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 创建单元格内容不显⽰⾃动换⾏//cellStyle.setWrapText(true);// 设置单元格字体样式XSSFFont font = (XSSFFont) workbook.createFont();// font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗 font.setFontName("宋体");// 设置字体font.setFontHeight(10);// 设置字体的⼤⼩cellStyle.setFont(font);// 将字体添加到表格中去// 设置单元格边框为细线条cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);return cellStyle;}public Cell setHeadStyle(String[] titles, SXSSFWorkbook workbook) {Cell cell = null;CellStyle headStyle = getHeadStyle(workbook);Row headRow = sheet.createRow(0);// 构建表头for (int i = 0; i < titles.length; i++) {cell = headRow.createCell(i);cell.setCellStyle(headStyle);cell.setCellValue(titles[i]);}return cell;}/** 列头单元格样式*/public CellStyle getColumnTopStyle(SXSSFWorkbook workbook) {// 设置字体Font font = workbook.createFont();// 设置字体⼤⼩font.setFontHeightInPoints((short) 18);// 字体加粗font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置字体名字font.setFontName("Courier New");// 设置样式;CellStyle style = workbook.createCellStyle();// 设置底边框;style.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 设置底边框颜⾊;style.setBottomBorderColor(HSSFColor.BLACK.index);// 设置左边框;style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 设置左边框颜⾊;style.setLeftBorderColor(HSSFColor.BLACK.index);// 设置右边框;style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 设置右边框颜⾊;style.setRightBorderColor(HSSFColor.BLACK.index);// 设置顶边框;style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 设置顶边框颜⾊;style.setTopBorderColor(HSSFColor.BLACK.index);// 在样式⽤应⽤设置的字体;style.setFont(font);// 设置⾃动换⾏;style.setWrapText(false);// 设置⽔平对齐的样式为居中对齐;style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置垂直对齐的样式为居中对齐;style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);return style;}}三 csv/** 导出委外催收中EXCEL ⼤数据量csv导出* @return*/@RequestMapping("/excel")public Object exportExcel111(Page page, HttpServletResponse response ) {PageData pd = new PageData();pd = this.getPageData();try {//检索条件===========PageData pageData = service.setPdWithTrim(this.getPageData());page.setPd(pageData);//检索条件===========Map<String, Object> dataMap = service.AssignMiddleExcel(page);String sheetName = "逾期客户表";List<Object> headlist = (List<Object>)dataMap.get("titles");List<List<Object>> dataList = new ArrayList<>();List<PageData> varList = new ArrayList<PageData>();varList = (List<PageData>)dataMap.get("varList");varList.forEach(e ->{List<Object> ObjectList = new ArrayList<>();for(int i=0;i<headlist.size();i++){ObjectList.add(e.get("var"+(i+1))==null?null:e.getString("var"+(i+1)));}dataList.add(ObjectList);});File csvFile =CSVUtils.createCSVFile(headlist,dataList,sheetName);BufferedInputStream bis = null;BufferedOutputStream bos = null;response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(csvFile.getName(), "UTF-8")); response.setHeader("Content-Length", String.valueOf(csvFile.length()));bis = new BufferedInputStream(new FileInputStream(csvFile));bos = new BufferedOutputStream(response.getOutputStream());byte[] buff = new byte[2048];while (true) {int bytesRead;if (-1 == (bytesRead = bis.read(buff, 0, buff.length))) break;bos.write(buff, 0, bytesRead);}bis.close();bos.close();csvFile.delete();}catch (Exception e){e.printStackTrace();}return new Object();}package com.fh.controller.assign_out;import javax.servlet.http.HttpServletRequest;import java.io.*;import java.util.*;/*** Created by dell、 on 2017/10/12.*/public class CSVUtils {/*** CSV⽂件⽣成⽅法* @param head* @param dataList* @param filename* @return*/public static File createCSVFile(List<Object> head, List<List<Object>> dataList,String filename) {File csvFile = null;BufferedWriter csvWtriter = null;try {csvFile = new File( "temp123/"+ File.separator + filename + ".csv");File parent = csvFile.getParentFile();if (parent != null && !parent.exists()) {parent.mkdirs();}csvFile.createNewFile();// GB2312使正确读取分隔符","csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "GB2312"), 1024);// 写⼊⽂件头部writeRow(head, csvWtriter);// 写⼊⽂件内容for (List<Object> row : dataList) {writeRow(row, csvWtriter);}csvWtriter.flush();} catch (Exception e) {e.printStackTrace();} finally {try {csvWtriter.close();} catch (IOException e) {e.printStackTrace();}}return csvFile;}/*** 写⼀⾏数据⽅法* @param row* @param csvWriter* @throws IOException*/private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException { // 写⼊⽂件头部for (Object data : row) {StringBuffer sb = new StringBuffer();String rowStr = sb.append("\"").append(data).append("\",").toString();csvWriter.write(rowStr);}csvWriter.newLine();}public static File createCSVFile(HttpServletRequest request){List< Map<String,Object>> list = new ArrayList<>();for(int i =0;i<10;i++){Map<String,Object> mao = new HashMap<>();mao.put("cutomerName","zhangsan"+i);mao.put("cutomerNam1","zhangsan"+i);mao.put("cutomerNam2","zhangsan"+i);mao.put("cutomerNam3","zhangsan"+i);mao.put("cutomerNam4","zhangsan"+i);mao.put("cutomerNam5","zhangsan"+i);mao.put("cutomerNam6","zhangsan"+i);mao.put("cutomerNam7","zhangsan"+i);mao.put("cutomerNam8","zhangsan"+i);mao.put("cutomerNam9", "2017-10-17 22:33:33 12.00");mao.put("cutomerNam10",555555556);/* mao.put("cutomerNam11","zhangsan"+i);mao.put("cutomerNam12","zhangsan"+i);mao.put("cutomerNam13","zhangsan"+i);mao.put("cutomerNam14","zhangsan"+i);mao.put("cutomerNam15","zhangsan"+i);mao.put("cutomerNam16","zhangsan"+i);mao.put("cutomerNam17","zhangsan"+i);mao.put("cutomerNam18","zhangsan"+i);mao.put("cutomerNam19","zhangsan"+i);mao.put("cutomerNam20","zhangsan"+i);mao.put("cutomerNam21","zhangsan"+i);mao.put("cutomerNam22","zhangsan"+i);mao.put("cutomerNam23","zhangsan"+i);mao.put("cutomerNam24","zhangsan"+i);mao.put("cutomerNam25","zhangsan"+i);mao.put("cutomerNam26","zhangsan"+i);mao.put("cutomerNam27","zhangsan"+i);mao.put("cutomerNam28","zhangsan"+i);mao.put("cutomerNam29","zhangsan"+i);mao.put("cutomerNam30","zhangsan"+i);mao.put("cutomerNam31","zhangsan"+i);mao.put("cutomerNam32","zhangsan"+i);mao.put("cutomerNam33","zhangsan"+i);mao.put("cutomerNam34","zhangsan"+i);mao.put("cutomerNam35","zhangsan"+i);mao.put("cutomerNam36","zhangsan"+i);mao.put("cutomerNam37","zhangsan"+i);mao.put("cutomerNam38","zhangsan"+i);mao.put("cutomerNam39","zhangsan"+i);mao.put("cutomerNam40","zhangsan"+i);mao.put("cutomerNam41","zhangsan"+i);mao.put("cutomerNam42","zhangsan"+i);mao.put("cutomerNam43","zhangsan"+i);mao.put("cutomerNam44","zhangsan"+i);mao.put("cutomerNam45","zhangsan"+i);*/list.add(mao);}// 设置表格头Object[] head = {"客户姓名", "证件类型", "证件号码", "银⾏账号", "理财账号", "客户类型", "风险等级", "归属状况", "归属机构", "客户经理", "营销⽐例(%)" }; List<Object> headList = Arrays.asList(head);// 设置数据List<List<Object>> dataList = new ArrayList<List<Object>>();List<Object> rowList = null;for (int i = 0; i < list.size(); i++) {rowList = new ArrayList<Object>();Map<String,Object> maovo = list.get(i);rowList.add(maovo.get("cutomerName"));rowList.add(maovo.get("cutomerNam1"));rowList.add(maovo.get("cutomerNam2"));rowList.add(maovo.get("cutomerNam3"));rowList.add(maovo.get("cutomerNam4"));rowList.add(maovo.get("cutomerNam5"));rowList.add(maovo.get("cutomerNam6"));rowList.add(maovo.get("cutomerNam7"));rowList.add(maovo.get("cutomerNam8"));rowList.add(maovo.get("cutomerNam9"));rowList.add(maovo.get("cutomerNam10"));dataList.add(rowList);}// 导出⽂件路径// String downloadFilePath = request.getContextPath();// 导出⽂件名称String fileName = "客户列表_";// 导出CSV⽂件File csvFile = CSVUtils.createCSVFile(headList, dataList, fileName);return csvFile;}}。
POI操作Excel常用方法总结
POI操作Excel常用方法总结一、POI简介Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
二、HSSF概况HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
三、POI EXCEL文档结构类HSSFWorkbook excel文档对象HSSFSheet excel的sheet HSSFRow excel的行HSSFCell excel的单元格HSSFFont excel字体HSSFName 名称HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾HSSFCellStyle cell样式HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表四、EXCEL常用操作方法1、得到Excel常用对象view plaincopy to clipboardprint?1.POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));2.//得到Excel工作簿对象3.HSSFWorkbook wb = new HSSFWorkbook(fs);4.//得到Excel工作表对象5.HSSFSheet sheet = wb.getSheetAt(0);6.//得到Excel工作表的行7.HSSFRow row = sheet.getRow(i);8.//得到Excel工作表指定行的单元格9.HSSFCell cell = row.getCell((short) j);10.cellStyle = cell.getCellStyle();//得到单元格样式1.HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象2.HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象3.HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行4.cellStyle = wb.createCellStyle();//创建单元格样式5.row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行的单元格6.row.createCell((short)0).setCellValue(1); //设置Excel工作表的值3、设置sheet名称和单元格内容view plaincopy to clipboardprint?1.wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16);2.cell.setEncoding((short) 1);3.cell.setCellValue("单元格内容");1.wb.getNumberOfSheets()1.HSSFSheet sheet = wb.getSheetAt(0);1.int rowcount = sheet.getLastRowNum();view plaincopy to clipboardprint?1.row.getLastCellNum();1.cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型2.cell.getNumericCellValue();//读取为数值类型的单元格内容1.sheet.setColumnWidth((short)column,(short)width);2.row.setHeight((short)height);1.Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo2.,(short)columnTo);//合并从第rowFrom行columnFrom列3.sheet.addMergedRegion(region);// 到rowTo行columnTo的区域4.//得到所有区域5.sheet.getNumMergedRegions()1.FileOutputStream fileOut = new FileOutputStream(path);2.wb.write(fileOut);1.public String getCellStringValue(HSSFCell cell) {2. String cellValue = "";3. switch (cell.getCellType()) {4. case HSSFCell.CELL_TYPE_STRING://字符串类型5. cellValue = cell.getStringCellValue();6. if(cellValue.trim().equals("")||cellValue.trim().length()<=0)7. cellValue=" ";8. break;9. case HSSFCell.CELL_TYPE_NUMERIC: //数值类型10. cellValue = String.valueOf(cell.getNumericCellValue());11. break;12. case HSSFCell.CELL_TYPE_FORMULA: //公式13. cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);14. cellValue = String.valueOf(cell.getNumericCellValue());15. break;16. case HSSFCell.CELL_TYPE_BLANK:17. cellValue=" ";18. break;19. case HSSFCell.CELL_TYPE_BOOLEAN:20. break;21. case HSSFCell.CELL_TYPE_ERROR:22. break;23. default:24. break;25. }26. return cellValue;27. }13、常用单元格边框格式view plaincopy to clipboardprint?1.HSSFCellStyle style = wb.createCellStyle();2.style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框3.style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框4.style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框5.style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框1.HSSFFont f = wb.createFont();2. f.setFontHeightInPoints((short) 11);//字号3. f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗4.style.setFont(f);5.style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中6.style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中7.style.setRotation(short rotation);//单元格内容的旋转的角度8.HSSFDataFormat df = wb.createDataFormat();9.style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式10.cell.setCellFormula(string);//给单元格设公式11.style.setRotation(short rotation);//单元格内容的旋转的角度1.//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray2. ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();3. BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));4. ImageIO.write(bufferImg,"jpg",byteArrayOut);5.//读进一个excel模版6.FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");7.fs = new POIFSFileSystem(fos);8.//创建一个工作薄9.HSSFWorkbook wb = new HSSFWorkbook(fs);10.HSSFSheet sheet = wb.getSheetAt(0);11.HSSFPatriarch patriarch = sheet.createDrawingPatriarch();12.HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);13.patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));1.HSSFWorkbook wb = new HSSFWorkbook();2.HSSFSheet sheet = wb.createSheet("format sheet");3.HSSFPrintSetup ps = sheet.getPrintSetup();4.sheet.setAutobreaks(true);5.ps.setFitHeight((short)1);6.ps.setFitWidth((short)1);1.HSSFSheet sheet = wb.createSheet("Sheet1");2.wb.setPrintArea(0, "$A$1:$C$2");1.HSSFSheet sheet = wb.createSheet("format sheet");2.HSSFFooter footer = sheet.getFooter()3.footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );1.HSSFWorkbook wb = new HSSFWorkbook();2.HSSFSheet sheet = wb.createSheet("row sheet");3.// Create various cells and rows for spreadsheet.4.// Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)5.sheet.shiftRows(5, 10, -5);20、选中指定的工作表view plaincopy to clipboardprint?1.HSSFSheet sheet = wb.createSheet("row sheet");2.heet.setSelected(true);1.HSSFSheet sheet1 = wb.createSheet("new sheet");2.sheet1.setZoom(1,2); // 50 percent magnification1.HSSFSheet sheet = wb.createSheet("new sheet");2.HSSFHeader header = sheet.getHeader();3.header.setCenter("Center Header");4.header.setLeft("Left Header");5.header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +6.HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");1.HSSFCellStyle style = wb.createCellStyle();2.style.setFillForegroundColor(HSSFColor.LIME.index);3.style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);4.HSSFFont font = wb.createFont();5.font.setColor(HSSFColor.RED.index);6.style.setFont(font);7.cell.setCellStyle(style);1.HSSFCellStyle style = wb.createCellStyle();2.style.setFillBackgroundColor(HSSFColor.AQUA.index);3.style.setFillPattern(HSSFCellStyle.BIG_SPOTS);4.HSSFCell cell = row.createCell((short) 1);5.cell.setCellValue("X");6.style = wb.createCellStyle();7.style.setFillForegroundColor(HSSFColor.ORANGE.index);8.style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);9.cell.setCellStyle(style);1.HSSFFormulaEvaluator eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);2.private static void updateFormula(Workbook wb,Sheet s,int row){3. Row r=s.getRow(row);4. Cell c=null;5. FormulaEcaluator eval=null;6. if(wb instanceof HSSFWorkbook)7. eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);8. else if(wb instanceof XSSFWorkbook)9. eval=new XSSFFormulaEvaluator((XSSFWorkbook) wb);10. for(int i=r.getFirstCellNum();i<r.getLastCellNum();i++){11. c=r.getCell(i);12. if(c.getCellType()==Cell.CELL_TYPE_FORMULA)13. eval.evaluateFormulaCell(c);14. }15. }laCells(HSSFWorkbook wb) ,计算一个Excel文件的所有公式,用起来很方便。
Java开发小技巧(六):使用ApachePOI读取Excel
Java开发⼩技巧(六):使⽤ApachePOI读取Excel前⾔在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这⾥所说的数据源并⾮仅仅是指数据库,还包括excel、csv、xml等各种类型的数据接⼝⽂件,⽽这些⽂件中的数据不⼀定是结构化存储的,⽐如各种各样的报表⽂件,往往是⼀些复杂的表格结构,其中不仅有我们需要的数据,还有⼀些冗余的、⽆价值的数据,这时我们就⽆法直接⽤⼀般数据加载⼯具直接读取⼊库了。
也许你会想,数据源导出⽂件前先处理好数据就⾏了。
然⽽,实际开发中数据源往往是多个的,⽽且涉及到不同的部门甚⾄公司,这其间难免会出现各种⿇烦,甚⾄有些数据⽂件还是纯⼿⼯处理的,不⼀定能给到你满意的数据格式。
所以我们不讨论谁该负责转换的问题,这⾥主要介绍如何使⽤Apache POI来从Excel数据⽂件中读取我们想要的数据,以及⽤Bean Validation对数据内容按照预定的规则进⾏校验。
⽂章要点:Apache POI是什么如何使⽤Apache POI读取Excel⽂件使⽤Bean Validation进⾏数据校验Excel读取⼯具类使⽤实例Apache POI是什么Apache POI是⽤Java编写的免费开源的跨平台的Java API,提供API给Java程式对Microsoft Office格式档案进⾏读和写的操作。
如何使⽤Apache POI处理Excel⽂件1、导⼊Maven依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><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><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version></dependency>2、创建Workbook实例这⾥需要注意的是Excel⽂档的版本问题,Excel2003及以前版本的⽂档使⽤HSSFWorkbook对象,Excel2007及之后版本使⽤HSSFWorkbook对象// Excel2003及以前版本Workbook workbook = new XSSFWorkbook(new FileInputStream(path));// Excel2007及之后版本Workbook workbook = new HSSFWorkbook(new FileInputStream(path));3、获取Sheet表格页对象Sheet是Excel⽂档中的⼯作簿即表格页⾯,读取前要先找到数据所在页⾯,可以通过标签名或者索引的⽅式获取指定Sheet对象// 按索引获取Sheet sheet = workbook.getSheetAt(index);// 按标签名获取4、获取Cell单元格对象// ⾏索引row和列索引col都是以 0 起始Cell cell = sheet.getRow(row).getCell(col);5、获取单元格内容获取单元格的值之前⾸先要获知单元格内容的类型,在Excel中单元格有6种类型:1. CELL_TYPE_BLANK :空值2. CELL_TYPE_BOOLEAN :布尔型3. CELL_TYPE_ERROR :错误4. CELL_TYPE_FORMULA :公式型5. CELL_TYPE_STRING:字符串型6. CELL_TYPE_NUMERIC:数值型各种类型的内容还需要进⼀步判断其数据格式,例如单元格的Type为CELL_TYPE_NUMERIC时,它有可能是Date类型,在Excel中的Date 类型是以Double类型的数字存储的,不同类型的值要调⽤cell对象相应的⽅法去获取,具体情况具体分析public Object getCellValue(Cell cell) {if(cell == null) {return null;}switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:return cell.getRichStringCellValue().getString();case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {return cell.getDateCellValue();} else {return cell.getNumericCellValue();}case Cell.CELL_TYPE_BOOLEAN:return cell.getBooleanCellValue();case Cell.CELL_TYPE_FORMULA:return formula.evaluate(cell).getNumberValue();default:return null;}}6、关闭Workbook对象workbook.close();使⽤Bean Validation进⾏数据校验当你要处理⼀个业务逻辑时,数据校验是你不得不考虑和⾯对的事情,程序必须通过某种⼿段来确保输⼊进来的数据从语义上来讲是正确的或者符合预定义的格式,⼀个Java程序⼀般是分层设计的,⽽不同的层可能是不同的开发⼈员来完成,这样就很容易出现不同的层重复进⾏数据验证逻辑,导致代码冗余等问题。
POI操作Excel详解,HSSF和XSSF两种方式
POI操作Excel详解,HSSF和XSSF两种⽅式HSSF⽅式:1package com.tools.poi.lesson1;23import java.io.FileInputStream;4import java.io.FileNotFoundException;5import java.io.FileOutputStream;6import java.io.IOException;7import java.text.ParseException;8import java.text.SimpleDateFormat;9import java.util.ArrayList;10import java.util.List;1112import ermodel.HSSFCell;13import ermodel.HSSFCellStyle;14import ermodel.HSSFRow;15import ermodel.HSSFSheet;16import ermodel.HSSFWorkbook;17import org.apache.poi.hssf.util.HSSFColor;18import org.apache.poi.poifs.filesystem.POIFSFileSystem;19import ermodel.Cell;20import ermodel.CellStyle;2122import com.tools.poi.bean.Student;2324public class ExcelUtilWithHSSF {25public static void main(String[] args) {26try {27 getExcelAsFile("aaa");28 } catch (FileNotFoundException e) {29 e.printStackTrace();30 } catch (IOException e) {31 e.printStackTrace();32 }333435// try {36// CreateExcelDemo1();37// } catch (ParseException e) {38// e.printStackTrace();39// }404142 }4344/**45 * 得到Excel,并解析内容46 * @param file47 * @throws FileNotFoundException48 * @throws IOException49*/50public static void getExcelAsFile(String file) throws FileNotFoundException, IOException{51//1.得到Excel常⽤对象52// POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:/FTP/test.xls"));53 POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:/FTP/new1.xls"));54//2.得到Excel⼯作簿对象55 HSSFWorkbook wb = new HSSFWorkbook(fs);56//3.得到Excel⼯作表对象57 HSSFSheet sheet = wb.getSheetAt(0);58//总⾏数59int trLength = sheet.getLastRowNum();60//4.得到Excel⼯作表的⾏61 HSSFRow row = sheet.getRow(0);62//总列数63int tdLength = row.getLastCellNum();64//5.得到Excel⼯作表指定⾏的单元格65 HSSFCell cell = row.getCell((short)1);66//6.得到单元格样式67 CellStyle cellStyle = cell.getCellStyle();68for(int i=0;i<trLength;i++){69//得到Excel⼯作表的⾏70 HSSFRow row1 = sheet.getRow(i);71for(int j=0;j<tdLength;j++){7273//得到Excel⼯作表指定⾏的单元格74 HSSFCell cell1 = row1.getCell(j);7576/**77 * 为了处理:Excel异常Cannot get a text value from a numeric cell78 * 将所有列中的内容都设置成String类型格式79*/80if(cell1!=null){81 cell1.setCellType(Cell.CELL_TYPE_STRING);82 }8384//获得每⼀列中的值85 System.out.print(cell1.getStringCellValue()+"\t\t\t");86 }87 System.out.println();88 }89 }909192/**93 * 创建Excel,并写⼊内容94*/95public static void CreateExcel(){9697//1.创建Excel⼯作薄对象98 HSSFWorkbook wb = new HSSFWorkbook();99//2.创建Excel⼯作表对象100 HSSFSheet sheet = wb.createSheet("new Sheet");101//3.创建Excel⼯作表的⾏102 HSSFRow row = sheet.createRow(6);103//4.创建单元格样式104 CellStyle cellStyle =wb.createCellStyle();105// 设置这些样式106 cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);107 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);108 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);109 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);110 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);111 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);112 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);113114115116//5.创建Excel⼯作表指定⾏的单元格117 row.createCell(0).setCellStyle(cellStyle);118//6.设置Excel⼯作表的值119 row.createCell(0).setCellValue("aaaa");120121 row.createCell(1).setCellStyle(cellStyle);122 row.createCell(1).setCellValue("bbbb");123124125//设置sheet名称和单元格内容126 wb.setSheetName(0,"第⼀张⼯作表");127//设置单元格内容 cell.setCellValue("单元格内容");128129// 最后⼀步,将⽂件存到指定位置130try131 {132 FileOutputStream fout = new FileOutputStream("E:/students.xls");133 wb.write(fout);134 fout.close();135 }136catch (Exception e)137 {138 e.printStackTrace();139 }140 }141142/**143 * 创建Excel的实例144 * @throws ParseException145*/146public static void CreateExcelDemo1() throws ParseException{147 List list = new ArrayList();148 SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");149 Student user1 = new Student(1, "张三", 16,true, df.parse("1997-03-12"));150 Student user2 = new Student(2, "李四", 17,true, df.parse("1996-08-12"));151 Student user3 = new Student(3, "王五", 26,false, df.parse("1985-11-12"));152 list.add(user1);153 list.add(user2);154 list.add(user3);155156157// 第⼀步,创建⼀个webbook,对应⼀个Excel⽂件158 HSSFWorkbook wb = new HSSFWorkbook();159// 第⼆步,在webbook中添加⼀个sheet,对应Excel⽂件中的sheet160 HSSFSheet sheet = wb.createSheet("学⽣表⼀");161// 第三步,在sheet中添加表头第0⾏,注意⽼版本poi对Excel的⾏数列数有限制short 162 HSSFRow row = sheet.createRow((int) 0);163// 第四步,创建单元格,并设置值表头设置表头居中164 HSSFCellStyle style = wb.createCellStyle();165 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建⼀个居中格式166167 HSSFCell cell = row.createCell((short) 0);168 cell.setCellValue("学号");169 cell.setCellStyle(style);170 cell = row.createCell((short) 1);171 cell.setCellValue("姓名");172 cell.setCellStyle(style);173 cell = row.createCell((short) 2);174 cell.setCellValue("年龄");175 cell.setCellStyle(style);176 cell = row.createCell((short) 3);177 cell.setCellValue("性别");178 cell.setCellStyle(style);179 cell = row.createCell((short) 4);180 cell.setCellValue("⽣⽇");181 cell.setCellStyle(style);182183// 第五步,写⼊实体数据实际应⽤中这些数据从数据库得到,184185for (int i = 0; i < list.size(); i++)186 {187 row = sheet.createRow((int) i + 1);188 Student stu = (Student) list.get(i);189// 第四步,创建单元格,并设置值190 row.createCell((short) 0).setCellValue((double) stu.getId());191 row.createCell((short) 1).setCellValue(stu.getName());192 row.createCell((short) 2).setCellValue((double) stu.getAge());193 row.createCell((short)3).setCellValue(stu.getSex()==true?"男":"⼥"); 194 cell = row.createCell((short) 4);195 cell.setCellValue(new SimpleDateFormat("yyyy-mm-dd").format(stu 196 .getBirthday()));197 }198// 第六步,将⽂件存到指定位置199try200 {201 FileOutputStream fout = new FileOutputStream("E:/students.xls"); 202 wb.write(fout);203 fout.close();204 }205catch (Exception e)206 {207 e.printStackTrace();208 }209210211212 }213 }XSSF⽅式:1package com.tools.poi.lesson1;23import java.io.File;4import java.io.FileInputStream;5import java.io.FileNotFoundException;6import java.io.FileOutputStream;7import java.io.IOException;8import java.io.InputStream;9import java.io.OutputStream;10import java.text.ParseException;11import java.text.SimpleDateFormat;12import java.util.ArrayList;13import java.util.List;1415import ermodel.HSSFCell;16import ermodel.HSSFCellStyle;17import ermodel.HSSFRow;18import ermodel.HSSFSheet;19import ermodel.HSSFWorkbook;20import org.apache.poi.hssf.util.HSSFColor;21import org.apache.poi.openxml4j.exceptions.InvalidFormatException;22import org.apache.poi.poifs.filesystem.POIFSFileSystem;23import ermodel.Cell;24import ermodel.CellStyle;25import ermodel.Row;26import ermodel.Sheet;27import ermodel.Workbook;28import ermodel.WorkbookFactory;29import org.apache.poi.ss.util.WorkbookUtil;3031import com.tools.poi.bean.Student;3233public class ExcelUtilWithXSSF {34public static void main(String[] args) {35try {36 getExcelAsFile("d:/FTP/系统报表.xls");37 } catch (FileNotFoundException e) {38 e.printStackTrace();39 } catch (IOException e) {40 e.printStackTrace();41 } catch (InvalidFormatException e) {42 e.printStackTrace();43 }444546// try {47// CreateExcelDemo1();48// } catch (ParseException e) {49// e.printStackTrace();50// }515253 }5455/**56 * 得到Excel,并解析内容对2007及以上版本使⽤XSSF解析57 * @param file58 * @throws FileNotFoundException59 * @throws IOException60 * @throws InvalidFormatException61*/62public static void getExcelAsFile(String file) throws FileNotFoundException, IOException, InvalidFormatException{ 63////1.得到Excel常⽤对象64// POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:/FTP/new1.xls"));65////2.得到Excel⼯作簿对象66// HSSFWorkbook wb = new HSSFWorkbook(fs);67686970 InputStream ins = null;71 Workbook wb = null;72 ins=new FileInputStream(new File(file));73//ins= ExcelService.class.getClassLoader().getResourceAsStream(filePath);74 wb = WorkbookFactory.create(ins);75 ins.close();767778//3.得到Excel⼯作表对象79 Sheet sheet = wb.getSheetAt(0);80//总⾏数81int trLength = sheet.getLastRowNum();82//4.得到Excel⼯作表的⾏83 Row row = sheet.getRow(0);84//总列数85int tdLength = row.getLastCellNum();86//5.得到Excel⼯作表指定⾏的单元格87 Cell cell = row.getCell((short)1);88//6.得到单元格样式89 CellStyle cellStyle = cell.getCellStyle();9091for(int i=5;i<trLength;i++){92//得到Excel⼯作表的⾏93 Row row1 = sheet.getRow(i);94for(int j=0;j<tdLength;j++){95//得到Excel⼯作表指定⾏的单元格96 Cell cell1 = row1.getCell(j);97/**98 * 为了处理:Excel异常Cannot get a text value from a numeric cell99 * 将所有列中的内容都设置成String类型格式100*/101if(cell1!=null){102 cell1.setCellType(Cell.CELL_TYPE_STRING);103 }104105if(j==5&&i<=10){106 cell1.setCellValue("1000");107 }108109//获得每⼀列中的值110 System.out.print(cell1+" ");111 }112 System.out.println();113 }114115//将修改后的数据保存116 OutputStream out = new FileOutputStream(file);117 wb.write(out);118 }119120121/**122 * 创建Excel,并写⼊内容123*/124public static void CreateExcel(){125126//1.创建Excel⼯作薄对象127 HSSFWorkbook wb = new HSSFWorkbook();128//2.创建Excel⼯作表对象129 HSSFSheet sheet = wb.createSheet("new Sheet");130//3.创建Excel⼯作表的⾏131 HSSFRow row = sheet.createRow(6);132//4.创建单元格样式133 CellStyle cellStyle =wb.createCellStyle();134// 设置这些样式135 cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);136 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);137 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);138 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);139 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);140 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);141 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);142143144145//5.创建Excel⼯作表指定⾏的单元格146 row.createCell(0).setCellStyle(cellStyle);147//6.设置Excel⼯作表的值148 row.createCell(0).setCellValue("aaaa");149150 row.createCell(1).setCellStyle(cellStyle);151 row.createCell(1).setCellValue("bbbb");152153154//设置sheet名称和单元格内容155 wb.setSheetName(0,"第⼀张⼯作表");156//设置单元格内容 cell.setCellValue("单元格内容");157158// 最后⼀步,将⽂件存到指定位置159try160 {161 FileOutputStream fout = new FileOutputStream("E:/students.xls");162 wb.write(fout);163 fout.close();164 }165catch (Exception e)166 {167 e.printStackTrace();168 }169 }170171/**172 * 创建Excel的实例173 * @throws ParseException174*/175public static void CreateExcelDemo1() throws ParseException{176 List list = new ArrayList();177 SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");178 Student user1 = new Student(1, "张三", 16,true, df.parse("1997-03-12"));179 Student user2 = new Student(2, "李四", 17,true, df.parse("1996-08-12"));180 Student user3 = new Student(3, "王五", 26,false, df.parse("1985-11-12"));181 list.add(user1);182 list.add(user2);183 list.add(user3);184185186// 第⼀步,创建⼀个webbook,对应⼀个Excel⽂件187 HSSFWorkbook wb = new HSSFWorkbook();188// 第⼆步,在webbook中添加⼀个sheet,对应Excel⽂件中的sheet189 HSSFSheet sheet = wb.createSheet("学⽣表⼀");190// 第三步,在sheet中添加表头第0⾏,注意⽼版本poi对Excel的⾏数列数有限制short 191 HSSFRow row = sheet.createRow((int) 0);192// 第四步,创建单元格,并设置值表头设置表头居中193 HSSFCellStyle style = wb.createCellStyle();194 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建⼀个居中格式195196 HSSFCell cell = row.createCell((short) 0);197 cell.setCellValue("学号");198 cell.setCellStyle(style);199 cell = row.createCell((short) 1);200 cell.setCellValue("姓名");201 cell.setCellStyle(style);202 cell = row.createCell((short) 2);203 cell.setCellValue("年龄");204 cell.setCellStyle(style);205 cell = row.createCell((short) 3);206 cell.setCellValue("性别");207 cell.setCellStyle(style);208 cell = row.createCell((short) 4);209 cell.setCellValue("⽣⽇");210 cell.setCellStyle(style);211212// 第五步,写⼊实体数据实际应⽤中这些数据从数据库得到,213214for (int i = 0; i < list.size(); i++)215 {216 row = sheet.createRow((int) i + 1);217 Student stu = (Student) list.get(i);218// 第四步,创建单元格,并设置值219 row.createCell((short) 0).setCellValue((double) stu.getId());220 row.createCell((short) 1).setCellValue(stu.getName());221 row.createCell((short) 2).setCellValue((double) stu.getAge());222 row.createCell((short)3).setCellValue(stu.getSex()==true?"男":"⼥"); 223 cell = row.createCell((short) 4);224 cell.setCellValue(new SimpleDateFormat("yyyy-mm-dd").format(stu 225 .getBirthday()));226 }227// 第六步,将⽂件存到指定位置228try229 {230 FileOutputStream fout = new FileOutputStream("E:/students.xls"); 231 wb.write(fout);232 fout.close();233 }234catch (Exception e)235 {236 e.printStackTrace();237 }238239240241 }242 }。
sxssfworkbook读取excel用法 -回复
sxssfworkbook读取excel用法-回复SXSSFWorkbok是Apache POI开发的一个针对大数据量Excel文件的读写工具。
在处理大型Excel文件时,传统的XSSFWorkbook可能会导致内存溢出,而SXSSFWorkbook则能够在内存使用上做出一定的优化。
一、什么是Apache POI?Apache POI是一个开源的Java API库,用于操作Microsoft Office格式的文件,包括Excel、Word和PowerPoint等。
Apache POI提供了一组类和方法,使得我们能够读取和写入Excel文件,操作单元格、行和列,设置样式和格式等。
二、为什么需要SXSSFWorkbook?在处理大型Excel文件时,通常会出现内存溢出的问题。
这是因为传统的XSSFWorkbook是将整个Excel文件加载到内存中,对内存的消耗较高,并且当Excel文件较大时,加载整个文件可能会导致内存溢出的问题。
SXSSFWorkbook是Apache POI在XSSFWorkbook的基础上进行了优化,采用了流式处理的方式来读写Excel文件。
它的设计理念是将Excel 文件拆分成多个片段,每次只处理一部分数据,然后将其写入临时文件,从而减少了对内存的消耗。
因此,SXSSFWorkbook适用于处理大型Excel文件,可以有效地解决内存溢出的问题。
三、SXSSFWorkbook的基本用法1. 导入必要的类库首先,我们需要在项目中导入Apache POI相关的类库,包括poi、poi-ooxml和poi-ooxml-schemas等。
2. 创建SXSSFWorkbook对象使用SXSSFWorkbok的构造方法可以创建一个SXSSFWorkbook对象,例如:javaSXSSFWorkbook workbook = new SXSSFWorkbook();3. 设置临时文件存储路径SXSSFWorkbook会将数据写入临时文件,默认存储路径是系统的临时文件夹。
HSSFWorkbook操作excel读写
HSSFWorkbook操作excel读写//exlel读操作MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;Iterator<String> iter = multipartRequest.getFileNames();File fileFile = null;while (iter.hasNext()) {MultipartFile multipartFile = multipartRequest.getFile(iter.next());String sourceName = multipartFile.getOriginalFilename();String base = request.getSession().getServletContext().getRealPath("/");File file = new File(base);if(!file.exists()){ file.mkdirs();}String path=base + File.separator + sourceName;File fileFile = new File(path);multipartFile.transferTo(fileFile);HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));HSSFSheet sheet = wb.getSheetAt(0);for(int j=0;j<sheet.getLastRowNum()+1;j++) {HSSFRow row = sheet.getRow(j);for(int i1=0; i1<row.getLastCellNum(); i1++) {HSSFCell cell = row.getCell(i1);System.out.println(cell.getRichStringCellValue());}} }//exlel写操作// 第⼀步,创建⼀个webbook,对应⼀个Excel⽂件HSSFWorkbook wb = new HSSFWorkbook();// 第⼆步,在webbook中添加⼀个sheet,对应Excel⽂件中的sheetHSSFSheet sheet = wb.createSheet(name);// 第三步,在sheet中添加表头第0⾏,注意⽼版本poi对Excel的⾏数列数有限制shortHSSFRow row = sheet.createRow(0);// 第四步,创建单元格,并设置值表头设置表头居中HSSFCellStyle style = wb.createCellStyle();style.setAlignment(HSSFCellStyle.ALIGN_CENTER);sheet.setColumnWidth(0, 10000);sheet.setColumnWidth(1, 7000);sheet.setColumnWidth(2, 4000);cell.setCellValue(TeacherConstant.TCITY);cell.setCellStyle(style);cell = row.createCell(1);cell.setCellValue(TeacherConstant.TNAME);cell.setCellStyle(style);cell = row.createCell(2);cell.setCellValue(TeacherConstant.TPHONE);cell.setCellStyle(style);for (int i = 0; i < pmUsers.size(); i++) {Map<String, Object> map = pmUsers.get(i);row = sheet.createRow(i + 1);cell = row.createCell(0);cell.setCellStyle(style);cell.setCellValue(new HSSFRichTextString(map.get("TotalCityName") + ""));cell = row.createCell(1);cell.setCellStyle(style);cell.setCellValue(new HSSFRichTextString(map.get("teacher_name") + ""));cell = row.createCell(2);cell.setCellStyle(style);cell.setCellValue(new HSSFRichTextString(map.get("teacher_phone") + ""));}// 第六步,将⽂件存到指定位置FileOutputStream file = null;String fileAdd = "";if (pmUsers.size() > 0) {if (paramBean.getCityId() == null) {fileAdd = realPath + pmUsers.get(0).get("TotalCityName").toString().substring(0, 3) + TeacherConstant.TTABLE + TeacherConstant.XLS;} else if (paramBean.getCountyId() == null) {fileAdd = realPath + pmUsers.get(0).get("TotalCityName").toString().substring(0, 6) + TeacherConstant.TTABLE + TeacherConstant.XLS;} else {fileAdd = realPath + pmUsers.get(0).get("TotalCityName").toString().substring(0, 9) + TeacherConstant.TTABLE + TeacherConstant.XLS;}} else {return;}try{file = new FileOutputStream(fileAdd);wb.write(file);}catch (Exception e){e.printStackTrace();}finally {file.close();}。
hssfworkbook方法
hssfworkbook方法HSSFWorkbook方法是Apache POI库中的一个重要类,用于处理Excel文件的读写操作。
本文将详细介绍HSSFWorkbook方法的使用,并探讨其在实际应用中的一些注意事项。
一、HSSFWorkbook方法简介HSSFWorkbook是Apache POI库中用于处理Excel文件的核心类之一。
它提供了一系列方法,可以创建、打开、读取和保存Excel 文件。
HSSF代表“Horrible Spreadsheet Format”,是POI库中用于处理Excel 97-2003文件格式的类库。
二、创建HSSFWorkbook对象要创建一个HSSFWorkbook对象,可以使用HSSFWorkbook的构造方法。
以下是创建一个新的Excel文件的示例代码:```javaHSSFWorkbook workbook = new HSSFWorkbook();```三、创建工作表在HSSFWorkbook对象中,可以使用createSheet方法来创建一个新的工作表。
以下是创建一个名为“Sheet1”的工作表的示例代码:```javaHSSFSheet sheet = workbook.createSheet("Sheet1");```四、设置单元格的值要设置单元格的值,可以使用setCellValue方法。
以下是将字符串“Hello World”设置到A1单元格的示例代码:```javaHSSFRow row = sheet.createRow(0);HSSFCell cell = row.createCell(0);cell.setCellValue("Hello World");```五、读取单元格的值要读取单元格的值,可以使用getCell方法。
以下是读取A1单元格的值的示例代码:```javaHSSFRow row = sheet.getRow(0);HSSFCell cell = row.getCell(0);String value = cell.getStringCellValue();```六、保存Excel文件要保存Excel文件,可以使用write方法将HSSFWorkbook对象写入输出流。
hssfworkbook 读取单元格公式(二)
hssfworkbook 读取单元格公式(二)hssfworkbook 读取单元格公式1. 介绍在进行Excel文件操作时,有时需要读取Excel单元格中的公式。
而hssfworkbook是Apache POI库中用于操作Excel 格式(.xls)文件的类库,它提供了一种方便的方式来处理Excel文件的读写操作。
2. 读取单元格公式的方法要读取Excel单元格中的公式,可以使用hssfworkbook的getCellFormula()方法。
该方法返回指定单元格中的公式字符串。
示例代码以下代码展示了如何使用hssfworkbook读取单元格公式。
import ;import ;import ;import ;import ;import ;public class ReadCellFormulaExample {public static void main(String[] args) {try {FileInputStream file = new FileInputStream(" ");HSSFWorkbook workbook = new HSSFWorkbook(fil e);HSSFSheet sheet = (0);HSSFRow row = (0);HSSFCell cell = (0);String formula = ();("Formula: " + formula);();();} catch (IOException e) {();}}}3. 相关公式示例以下列举了几个常见的Excel公式及其在代码中的读取方式。
SUM函数SUM函数用于求和。
HSSFCell cell = (0);String formula = (); // formula = "SUM(A1:A10)"AVERAGE函数AVERAGE函数用于求平均值。
poi 读取数据的正确方法
poi 读取数据的正确方法POI是一个功能强大的Java库,可以用于读取、写入和操作Microsoft Office格式的文档,如Excel、Word和PowerPoint。
使用POI读取数据的正确方法如下:1. 导入POI库:首先,确保已经在项目中导入了POI库的jar文件。
你可以从Apache POI的官方网站上下载最新的POI库。
2. 创建工作簿:使用POI库的HSSFWorkbook类创建一个新的Excel工作簿对象。
工作簿是Excel文档的最高级别容器,可以包含多个工作表。
3. 打开工作表:使用工作簿对象的getSheet()方法打开特定的工作表。
在括号中传入工作表的名称或索引。
4. 读取单元格数据:使用工作表对象的getRow()和getCell()方法读取单元格中的数据。
getRow()方法根据行号获取行对象,getCell()方法根据列号或索引获取单元格对象。
使用单元格对象的getStringCellValue()、getNumericCellValue()或getDateCellValue()等方法获取特定类型的数据。
5. 遍历单元格数据:可以使用循环结构遍历工作表中所有单元格的数据。
首先使用工作表对象的getLastRowNum()方法获取最后一行的行号,然后使用getRow()和getCell()方法遍历每个单元格。
以下是一个简单的示例代码,演示如何使用POI读取Excel文件中的数据:```javaimport java.io.FileInputStream;import java.io.IOException;import ermodel.HSSFWorkbook;import ermodel.*;public class ExcelReader {public static void main(String[] args) {try {FileInputStream file = new FileInputStream("path/to/excel/file.xls"); Workbook workbook = new HSSFWorkbook(file);Sheet sheet = workbook.getSheet("Sheet1");// 遍历每一行和每一列,并读取数据for (Row row : sheet) {for (Cell cell : row) {if (cell.getCellType() == CellType.STRING) {System.out.print(cell.getStringCellValue() + "\t");} else if (cell.getCellType() == CellType.NUMERIC) {System.out.print(cell.getNumericCellValue() + "\t");} else if (cell.getCellType() == CellType.BOOLEAN) {System.out.print(cell.getBooleanCellValue() + "\t");}}System.out.println(); // 换行}workbook.close();file.close();} catch (IOException e) {e.printStackTrace();}}}```以上是使用POI读取数据的正确方法。
sxssfworkbook读取excel用法
sxssfworkbook读取excel用法一、简介sxssfworkbook是ApachePOI库中的一个类,用于读取Excel文件。
它提供了方便的方法来读取Excel文件中的数据,包括单元格的值、格式、公式等。
二、基本用法1.引入库在使用sxssfworkbook之前,需要先引入ApachePOI库。
可以通过在代码中添加以下语句来引入库:```pythonermodel.Workbook;ermodel.XSSFWorkbook;```2.创建Workbook对象使用XSSFWorkbook类创建一个Workbook对象,该对象表示Excel文件。
可以通过以下代码创建对象:```javaWorkbookworkbook=newXSSFWorkbook("path/to/excel/file.xlsx ");```其中,"path/to/excel/file.xlsx"是Excel文件的路径。
如果Excel文件不在项目文件夹中,则需要提供完整的文件路径。
3.读取单元格数据使用sxssfworkbook的cell()方法可以读取Excel文件中指定单元格的数据。
可以通过指定单元格的行和列号来获取数据。
例如,以下代码可以读取第一个工作表的A1单元格的值:```javaCellcell=workbook.getSheetAt(0).getRow(0).getCell(0);Stringvalue=cell.getStringCellValue();```其中,第一个参数表示工作表的索引(从0开始),第二个参数表示行号,第三个参数表示列号。
getCell()方法返回一个Cell对象,可以使用该对象的getStringCellValue()方法获取单元格的值。
4.读取单元格格式使用sxssfworkbook的cell().getCellStyle()方法可以获取单元格的样式,包括字体、颜色、对齐方式等。
java poi excel 读写
题目:探索Java中POI库的Excel读写功能1. 简介Java作为一种广泛应用的编程语言,拥有丰富的库和框架来支持各种应用场景。
其中,POI(Poor Obfuscation Implementation)库是Java操作Microsoft Office格式文件的重要工具之一。
在POI库中,Excel的读写功能一直备受开发者关注,因为Excel在商业和数据处理领域有着广泛的应用。
本文将深入探讨Java中POI库的Excel读写功能,介绍其基本用法和注意事项。
2. POI库的基本概念POI库是Apache软件基金会的一个开源项目,旨在提供Java程序对Microsoft Office格式文件的读写功能。
它支持对Excel、Word和PowerPoint等文件的操作,其中Excel的读写功能是开发者们最为关注的部分。
POI库主要由HSSF(Horrible Spreadsheet Format)、XSSF(XML Spreadsheet Format)和SXSSF(Streaming Usermodel API)三个子项目组成,在具体应用时,开发者可以根据自己的需求选择合适的子项目来实现对Excel文件的读写。
3. Excel的读操作在POI库中,读取Excel文件的操作主要通过HSSFWorkbook和XSSFWorkbook来实现。
HSSFWorkbook用于操作.xls格式的文件,而XSSFWorkbook用于操作.xlsx格式的文件。
使用POI库读取Excel文件的过程包括打开Excel文件、读取工作表、遍历行和列数据等步骤。
在具体的代码实现中,开发者可以根据需求选择不同的API来完成特定的读取任务,例如使用HSSF类库来从.xls文件中读取数据,或者使用XSSF类库来从.xlsx文件中读取数据。
在读取Excel文件时,开发者需要注意文件格式、数据类型和异常处理等问题,以确保读取的准确性和健壮性。
sxssfworkbook读取excel用法 -回复
sxssfworkbook读取excel用法-回复标题:SXSSFWorkbook读取Excel文件的详细用法字数:1879字摘要:SXSSFWorkbook是Apache POI库中一个用于处理大型Excel文件的工具。
本文将深入探讨如何使用SXSSFWorkbook来读取Excel文件,并提供详细的步骤和示例代码。
引言:在日常工作和数据处理中,Excel表格是一种常见的数据格式。
然而,当面临大规模数据或者大型Excel文件时,传统的Excel读取方法可能会遇到性能问题。
为解决这个问题,Apache POI库引入了SXSSFWorkbook 类,它是一种基于XSSF(Streaming Usermodel,适用于大文件)的替代品。
SXSSFWorkbook可以快速读取大型Excel文件而不会导致内存问题。
本文将介绍SXSSFWorkbook读取Excel文件的基本步骤,包括准备工作、创建SXSSFWorkbook对象、操作Excel文件、读取数据和关闭资源等。
一、准备工作在使用SXSSFWorkbook读取Excel文件之前,需要确保已经正确安装以下工具:1. Java开发环境,如JDK等;2. Apache POI库,最新版本的jar文件。
二、创建SXSSFWorkbook对象在准备工作完成后,可以开始创建SXSSFWorkbook对象。
下面是一段示例代码:javaimport org.apache.poi.xssf.streaming.SXSSFWorkbook;public class ExcelReader {public static void main(String[] args) {SXSSFWorkbook workbook = new SXSSFWorkbook();}}在这个示例中,我们导入了SXSSFWorkbook类,并在main方法中创建了一个SXSSFWorkbook对象。
ApachePOI使用详解
ApachePOI使⽤详解Apache POI使⽤详解(转)转⾃1.POI结构与常⽤类(1)POI介绍Apache POI是Apache软件基⾦会的开源项⽬,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
.NET的开发⼈员则可以利⽤NPOI (POI for .NET) 来存取 Microsoft Office⽂档的功能。
(2)POI结构说明包名称说明HSSF提供读写Microsoft Excel XLS格式档案的功能。
XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF提供读写Microsoft Word DOC格式档案的功能。
HSLF提供读写Microsoft PowerPoint格式档案的功能。
HDGF提供读Microsoft Visio格式档案的功能。
HPBF提供读Microsoft Publisher格式档案的功能。
HSMF提供读Microsoft Outlook格式档案的功能。
(3)POI常⽤类说明类名说明HSSFWorkbook Excel的⽂档对象HSSFSheetExcel的表单HSSFRowExcel的⾏HSSFCellExcel的格⼦单元HSSFFont Excel字体HSSFDataFormat 格⼦单元的⽇期格式HSSFHeader Excel⽂档Sheet的页眉HSSFFooter Excel⽂档Sheet的页脚HSSFCellStyle 格⼦单元样式HSSFDateUtil ⽇期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表2.Excel的基本操作(1)创建Workbook和Sheet1. public class Test002. {3. public static void main(String[] args) throws IOException4. {5. String filePath="d:\\users\\lizw\\桌⾯\\POI\\sample.xls";//⽂件路径6. HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel⽂件(Workbook)7. HSSFSheet sheet = workbook.createSheet();//创建⼯作表(Sheet)8. sheet = workbook.createSheet("Test");//创建⼯作表(Sheet)9. FileOutputStream out = new FileOutputStream(filePath);10. workbook.write(out);//保存Excel⽂件11. out.close();//关闭⽂件流12. System.out.println("OK!");13. }14. }(2)创建单元格1. HSSFSheet sheet = workbook.createSheet("Test");// 创建⼯作表(Sheet)2. HSSFRow row = sheet.createRow(0);// 创建⾏,从0开始3. HSSFCell cell = row.createCell(0);// 创建⾏的单元格,也是从0开始4. cell.setCellValue("李志伟");// 设置单元格内容5. row.createCell(1).setCellValue(false);// 设置单元格内容,重载6. row.createCell(2).setCellValue(new Date());// 设置单元格内容,重载7. row.createCell(3).setCellValue(12.345);// 设置单元格内容,重载(3)创建⽂档摘要信息1. workbook.createInformationProperties();//创建⽂档信息2. DocumentSummaryInformation dsi=workbook.getDocumentSummaryInformation();//摘要信息3. dsi.setCategory("类别:Excel⽂件");//类别4. dsi.setManager("管理者:李志伟");//管理者5. dsi.setCompany("公司:--");//公司6. SummaryInformation si = workbook.getSummaryInformation();//摘要信息7. si.setSubject("主题:--");//主题8. si.setTitle("标题:测试⽂档");//标题9. si.setAuthor("作者:李志伟");//作者10. si.setComments("备注:POI测试⽂档");//备注(4)创建批注1. HSSFSheet sheet = workbook.createSheet("Test");// 创建⼯作表(Sheet)2. HSSFPatriarch patr = sheet.createDrawingPatriarch();3. HSSFClientAnchor anchor = patr.createAnchor(0, 0, 0, 0, 5, 1, 8,3);//创建批注位置4. HSSFComment comment = patr.createCellComment(anchor);//创建批注5. comment.setString(new HSSFRichTextString("这是⼀个批注段落!"));//设置批注内容6. comment.setAuthor("李志伟");//设置批注作者7. comment.setVisible(true);//设置批注默认显⽰8. HSSFCell cell = sheet.createRow(2).createCell(1);9. cell.setCellValue("测试");10. cell.setCellComment(comment);//把批注赋值给单元格创建批注位置HSSFPatriarch.createAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)⽅法参数说明:1. dx1 第1个单元格中x轴的偏移量2. dy1 第1个单元格中y轴的偏移量3. dx2 第2个单元格中x轴的偏移量4. dy2 第2个单元格中y轴的偏移量5. col1 第1个单元格的列号6. row1 第1个单元格的⾏号7. col2 第2个单元格的列号8. row2 第2个单元格的⾏号(5)创建页眉和页脚1. HSSFSheet sheet = workbook.createSheet("Test");// 创建⼯作表(Sheet)2. HSSFHeader header =sheet.getHeader();//得到页眉3. header.setLeft("页眉左边");4. header.setRight("页眉右边");5. header.setCenter("页眉中间");6. HSSFFooter footer =sheet.getFooter();//得到页脚7. footer.setLeft("页脚左边");8. footer.setRight("页脚右边");9. footer.setCenter("页脚中间");也可以使⽤Office⾃带的标签定义,你可以通过HSSFHeader或HSSFFooter访问到它们,都是静态属性,列表如下:1. HSSFHeader.tab &A 表名2. HSSFHeader.file &F ⽂件名3. HSSFHeader.startBold &B 粗体开始4. HSSFHeader.endBold &B 粗体结束5. HSSFHeader.startUnderline &U 下划线开始6. HSSFHeader.endUnderline &U 下划线结束7. HSSFHeader.startDoubleUnderline &E 双下划线开始8. HSSFHeader.endDoubleUnderline &E 双下划线结束9. HSSFHeader.time &T 时间10. HSSFHeader.date &D ⽇期11. HSSFHeader.numPages &N 总页⾯数12. HSSFHeader.page &P 当前页号3.Excel的单元格操作(1)设置格式1. HSSFSheet sheet = workbook.createSheet("Test");// 创建⼯作表(Sheet)2. HSSFRow row=sheet.createRow(0);3. //设置⽇期格式--使⽤Excel内嵌的格式4. HSSFCell cell=row.createCell(0);5. cell.setCellValue(new Date());6. HSSFCellStyle style=workbook.createCellStyle();7. style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));8. cell.setCellStyle(style);9. //设置保留2位⼩数--使⽤Excel内嵌的格式10. cell=row.createCell(1);11. cell.setCellValue(12.3456789);12. style=workbook.createCellStyle();13. style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));14. cell.setCellStyle(style);15. //设置货币格式--使⽤⾃定义的格式16. cell=row.createCell(2);17. cell.setCellValue(12345.6789);18. style=workbook.createCellStyle();19. style.setDataFormat(workbook.createDataFormat().getFormat("¥#,##0"));20. cell.setCellStyle(style);21. //设置百分⽐格式--使⽤⾃定义的格式22. cell=row.createCell(3);23. cell.setCellValue(0.123456789);24. style=workbook.createCellStyle();25. style.setDataFormat(workbook.createDataFormat().getFormat("0.00%"));26. cell.setCellStyle(style);27. //设置中⽂⼤写格式--使⽤⾃定义的格式28. cell=row.createCell(4);29. cell.setCellValue(12345);30. style=workbook.createCellStyle();31. style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0"));32. cell.setCellStyle(style);33. //设置科学计数法格式--使⽤⾃定义的格式34. cell=row.createCell(5);35. cell.setCellValue(12345);36. style=workbook.createCellStyle();37. style.setDataFormat(workbook.createDataFormat().getFormat("0.00E+00"));38. cell.setCellStyle(style);HSSFDataFormat.getFormat和HSSFDataFormat.getBuiltinFormat的区别:当使⽤Excel内嵌的(或者说预定义)的格式时,直接⽤HSSFDataFormat.getBuiltinFormat静态⽅法即可。
poi操作excel(读取)
poi操作excel(读取)poi读取excel有两种模式,⼀种是⽤户模式,⼀种是事件模式。
⽤户模式有许多封装好的⽅法操作简单,但创建太多的对象,⾮常耗内存。
当读取数据量太多时,就需要使⽤事件模式。
sax模式excel在07版后存储⽅式发⽣变化,因此事件模式也有两种读取接⼝。
⼀种读取excel03版以下;⼀种是excel07版以上,使⽤sax。
excel03版03版使⽤HSSFEventFactory来处理excel,HSSFEventFactory通过RecordFactoryInputStreaml循环获取Record.sid,将每⼀条送给HSSFRequest注册的监听器处理。
⽤户要处理每条记录还需要⾃定义⼀个HSSFListener,通过实例化processRecord(Record record)接⼝⽅法处理Record.sid。
关于Record.sid的类型,可以查看poi的api⽂档,⽂档有所有类型Record.sid的描述(这点⽐07版好,07版可能你还需要⾃⼰去找标签的意义)。
1、RecordFactoryInputStreaml:将数据转为Record.sid2、HSSFListener:监听获取每条Record.sid记录进⾏处理3、HSSFRequest:注册监听器HSSFEventFactory实例化代码⽰例:1/**2 * 初始化流监控3 * @param in4*/5public void readExcelContent(InputStream in,int rowNum){6this.rowNum = rowNum;7 POIFSFileSystem poifs = null;8 InputStream din = null;9try{10 poifs = new POIFSFileSystem(in);11 din = poifs.createDocumentInputStream("Workbook");12//这⼉为所有类型的Record都注册了监听器,如果需求明确的话,可以⽤addListener⽅法,并指定所需的Record类型13 HSSFRequest req = new HSSFRequest();14//添加监听记录的事件15 MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);16 formatListener = new FormatTrackingHSSFListener(listener); //监听代理,⽅便获取recordformat17 req.addListenerForAllRecords(formatListener);18//创建时间⼯⼚19 HSSFEventFactory factory = new HSSFEventFactory();20//处理基于时间⽂档流(循环获取每⼀条Record进⾏处理)21 factory.processEvents(req, din);22 }catch(Exception e){23throw new RuntimeException(e);24 }finally{25//关闭基于POI⽂档流26if (din != null) {27try {28 din.close();29 } catch (IOException io) {30throw new RuntimeException(io);31 }32 }33 }34 }excel07版excel07版是⼀种基于xml读取的发⽣取值,通过读取结构化的xml数据,取得表单数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java代码public class SummaryHSSF {public static void main(String[] args) throws IOException {//创建Workbook对象(这一个对象代表着对应的一个Excel文件)//HSSFWorkbook表示以xls为后缀名的文件Workbook wb = new HSSFWorkbook();//获得CreationHelper对象,这个应该是一个帮助类CreationHelper helper = wb.getCreationHelper();//创建Sheet并给名字(表示Excel的一个Sheet)Sheet sheet1 = wb.createSheet("HSSF_Sheet_1");Sheet sheet2 = wb.createSheet("HSSF_Sheet_2");//Row表示一行Cell表示一列Row row = null;Cell cell = null;for(int i=0;i<60;i=i+2){//获得这个sheet的第i行row = sheet1.createRow(i);//设置行长度自动//row.setHeight((short)500);row.setHeightInPoints(20);//row.setZeroHeight(true);for(int j=0;j<25;j++){//设置每个sheet每一行的宽度,自动,根据需求自行确定sheet1.autoSizeColumn(j+1, true);//创建一个基本的样式CellStyle cellStyle = SummaryHSSF.createStyleCell(wb);//获得这一行的每j列cell = row.createCell(j);if(j==0){//设置文字在单元格里面的位置cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);//先创建字体样式,并把这个样式加到单元格的字体里面cellStyle.setFont(createFonts(wb));//把这个样式加到单元格里面cell.setCellStyle(cellStyle);//给单元格设值cell.setCellValue(true);}else if(j==1){//设置文字在单元格里面的位置cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);//设置这个样式的格式(Format)cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "#,##0.0000");//先创建字体样式,并把这个样式加到单元格的字体里面cellStyle.setFont(createFonts(wb));//把这个样式加到单元格里面cell.setCellStyle(cellStyle);//给单元格设值cell.setCellValue(new Double(2008.2008));}else if(j==2){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle.setFont(createFonts(wb));cell.setCellStyle(cellStyle);cell.setCellValue(helper.createRichTextString("RichString"+i+j));}else if(j==3){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "MM-yyyy-dd");cell.setCellStyle(cellStyle);cell.setCellValue(new Date());}else if(j==24){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle.setFont(createFonts(wb));//设置公式cell.setCellFormula("SUM(E"+(i+1)+":X"+(i+1)+")");}else{cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle = SummaryHSSF.setFillBackgroundColors(cellStyle,IndexedColors.ORANGE.getIndex(),Indexed Colors.ORANGE.getIndex(),CellStyle.SOLID_FOREGROUND);cell.setCellStyle(cellStyle);cell.setCellValue(1);}}}//输出OutputStream os = new FileOutputStream(new File("c://SummaryHSSF.xls"));wb.write(os);os.close();}/*** 边框* @param wb* @return*/public static CellStyle createStyleCell(Workbook wb){CellStyle cellStyle = wb.createCellStyle();//设置一个单元格边框颜色cellStyle.setBorderBottom(CellStyle.BORDER_THIN);cellStyle.setBorderTop(CellStyle.BORDER_THIN);cellStyle.setBorderLeft(CellStyle.BORDER_THIN);cellStyle.setBorderRight(CellStyle.BORDER_THIN);//设置一个单元格边框颜色cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());return cellStyle;}/*** 设置文字在单元格里面的位置* CellStyle.ALIGN_CENTER* CellStyle.VERTICAL_CENTER* @param cellStyle* @param halign* @param valign* @return*/public static CellStyle setCellStyleAlignment(CellStyle cellStyle,short halign,short valign){ //设置上下cellStyle.setAlignment(CellStyle.ALIGN_CENTER);//设置左右cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);return cellStyle;}/*** 格式化单元格* 如#,##0.00,m/d/yy去HSSFDataFormat或XSSFDataFormat里面找* @param cellStyle* @param fmt* @return*/public static CellStyle setCellFormat(CreationHelper helper,CellStyle cellStyle,String fmt){ //还可以用其它方法创建formatcellStyle.setDataFormat(helper.createDataFormat().getFormat(fmt));return cellStyle;}/*** 前景和背景填充的着色* @param cellStyle* @param bg IndexedColors.ORANGE.getIndex();* @param fg IndexedColors.ORANGE.getIndex();* @param fp CellStyle.SOLID_FOREGROUND* @return*/public static CellStyle setFillBackgroundColors(CellStyle cellStyle,short bg,short fg,short fp){ //cellStyle.setFillBackgroundColor(bg);cellStyle.setFillForegroundColor(fg);cellStyle.setFillPattern(fp);return cellStyle;}/*** 设置字体* @param wb* @return*/public static Font createFonts(Workbook wb){//创建Font对象Font font = wb.createFont();//设置字体font.setFontName("黑体");//着色font.setColor(HSSFColor.BLUE.index);//斜体font.setItalic(true);//字体大小font.setFontHeight((short)300);return font;}}class=java style="DISPLAY: none" name="code"public class SummaryHSSF {public static void main(String[] args) throws IOException {//创建Workbook对象(这一个对象代表着对应的一个Excel文件)//HSSFWorkbook表示以xls为后缀名的文件Workbook wb = new HSSFWorkbook();//获得CreationHelper对象,这个应该是一个帮助类CreationHelper helper = wb.getCreationHelper();//创建Sheet并给名字(表示Excel的一个Sheet)Sheet sheet1 = wb.createSheet("HSSF_Sheet_1");Sheet sheet2 = wb.createSheet("HSSF_Sheet_2");//Row表示一行Cell表示一列Row row = null;Cell cell = null;for(int i=0;i<60;i=i+2){//获得这个sheet的第i行row = sheet1.createRow(i);//设置行长度自动//row.setHeight((short)500);row.setHeightInPoints(20);//row.setZeroHeight(true);for(int j=0;j<25;j++){//设置每个sheet每一行的宽度,自动,根据需求自行确定sheet1.autoSizeColumn(j+1, true);//创建一个基本的样式CellStyle cellStyle = SummaryHSSF.createStyleCell(wb);//获得这一行的每j列cell = row.createCell(j);if(j==0){//设置文字在单元格里面的位置cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);//先创建字体样式,并把这个样式加到单元格的字体里面cellStyle.setFont(createFonts(wb));//把这个样式加到单元格里面cell.setCellStyle(cellStyle);//给单元格设值cell.setCellValue(true);}else if(j==1){//设置文字在单元格里面的位置cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);//设置这个样式的格式(Format)cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "#,##0.0000");//先创建字体样式,并把这个样式加到单元格的字体里面cellStyle.setFont(createFonts(wb));//把这个样式加到单元格里面cell.setCellStyle(cellStyle);//给单元格设值cell.setCellValue(new Double(2008.2008));}else if(j==2){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle.setFont(createFonts(wb));cell.setCellStyle(cellStyle);cell.setCellValue(helper.createRichTextString("RichString"+i+j));}else if(j==3){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle = SummaryHSSF.setCellFormat(helper,cellStyle, "MM-yyyy-dd");cell.setCellStyle(cellStyle);cell.setCellValue(new Date());}else if(j==24){cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle.setFont(createFonts(wb));//设置公式cell.setCellFormula("SUM(E"+(i+1)+":X"+(i+1)+")");}else{cellStyle = SummaryHSSF.setCellStyleAlignment(cellStyle, CellStyle.ALIGN_CENTER, CellStyle.VERTICAL_CENTER);cellStyle = SummaryHSSF.setFillBackgroundColors(cellStyle,IndexedColors.ORANGE.getIndex(),IndexedColor s.ORANGE.getIndex(),CellStyle.SOLID_FOREGROUND);cell.setCellStyle(cellStyle);cell.setCellValue(1);}}}//输出OutputStream os = new FileOutputStream(new File("c://SummaryHSSF.xls"));wb.write(os);os.close();}/*** 边框* @param wb* @return*/public static CellStyle createStyleCell(Workbook wb){CellStyle cellStyle = wb.createCellStyle();//设置一个单元格边框颜色cellStyle.setBorderBottom(CellStyle.BORDER_THIN);cellStyle.setBorderTop(CellStyle.BORDER_THIN);cellStyle.setBorderLeft(CellStyle.BORDER_THIN);cellStyle.setBorderRight(CellStyle.BORDER_THIN);//设置一个单元格边框颜色cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());return cellStyle;}/*** 设置文字在单元格里面的位置* CellStyle.ALIGN_CENTER* CellStyle.VERTICAL_CENTER* @param cellStyle* @param halign* @param valign* @return*/public static CellStyle setCellStyleAlignment(CellStyle cellStyle,short halign,short valign){ //设置上下cellStyle.setAlignment(CellStyle.ALIGN_CENTER);//设置左右cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);return cellStyle;}/*** 格式化单元格* 如#,##0.00,m/d/yy去HSSFDataFormat或XSSFDataFormat里面找* @param cellStyle* @param fmt* @return*/public static CellStyle setCellFormat(CreationHelper helper,CellStyle cellStyle,String fmt){ //还可以用其它方法创建formatcellStyle.setDataFormat(helper.createDataFormat().getFormat(fmt));return cellStyle;}/*** 前景和背景填充的着色* @param cellStyle* @param bg IndexedColors.ORANGE.getIndex();* @param fg IndexedColors.ORANGE.getIndex();* @param fp CellStyle.SOLID_FOREGROUND* @return*/public static CellStyle setFillBackgroundColors(CellStyle cellStyle,short bg,short fg,short fp){ //cellStyle.setFillBackgroundColor(bg);cellStyle.setFillForegroundColor(fg);cellStyle.setFillPattern(fp);return cellStyle;}/*** 设置字体* @param wb* @return*/public static Font createFonts(Workbook wb){//创建Font对象Font font = wb.createFont();//设置字体font.setFontName("黑体");//着色font.setColor(HSSFColor.BLUE.index);//斜体font.setItalic(true);//字体大小font.setFontHeight((short)300);return font;}}读取Excel文件Java代码public class ReadExcel {public static void main(String[] args) throws Exception {InputStream is = new FileInputStream(new File("c://SummaryHSSF.xls"));//根据输入流创建Workbook对象Workbook wb = WorkbookFactory.create(is);//get到Sheet对象Sheet sheet = wb.getSheetAt(0);//这个必须用接口for(Row row : sheet){for(Cell cell : row){//cell.getCellType是获得cell里面保存的值的type//如Cell.CELL_TYPE_STRINGswitch(cell.getCellType()){case Cell.CELL_TYPE_BOOLEAN://得到Boolean对象的方法System.out.print(cell.getBooleanCellValue()+" ");break;case Cell.CELL_TYPE_NUMERIC://先看是否是日期格式if(DateUtil.isCellDateFormatted(cell)){//读取日期格式System.out.print(cell.getDateCellValue()+" ");}else{//读取数字System.out.print(cell.getNumericCellValue()+" ");}break;case Cell.CELL_TYPE_FORMULA://读取公式System.out.print(cell.getCellFormula()+" ");break;case Cell.CELL_TYPE_STRING://读取StringSystem.out.print(cell.getRichStringCellValue().toString()+" ");break;}}System.out.println("");}}}class=java style="DISPLAY: none" name="code"public class ReadExcel {public static void main(String[] args) throws Exception {InputStream is = new FileInputStream(new File("c://SummaryHSSF.xls"));//根据输入流创建Workbook对象Workbook wb = WorkbookFactory.create(is);//get到Sheet对象Sheet sheet = wb.getSheetAt(0);//这个必须用接口for(Row row : sheet){for(Cell cell : row){//cell.getCellType是获得cell里面保存的值的type//如Cell.CELL_TYPE_STRINGswitch(cell.getCellType()){case Cell.CELL_TYPE_BOOLEAN://得到Boolean对象的方法System.out.print(cell.getBooleanCellValue()+" ");break;case Cell.CELL_TYPE_NUMERIC://先看是否是日期格式if(DateUtil.isCellDateFormatted(cell)){//读取日期格式System.out.print(cell.getDateCellValue()+" ");}else{//读取数字System.out.print(cell.getNumericCellValue()+" ");}break;case Cell.CELL_TYPE_FORMULA://读取公式System.out.print(cell.getCellFormula()+" ");break;case Cell.CELL_TYPE_STRING://读取StringSystem.out.print(cell.getRichStringCellValue().toString()+" ");break;}}System.out.println("");}}}还有一种传统的读法Java代码Sheet sheet = wb.getSheetAt(0);for (Iterator rit = sheet.rowIterator(); rit.hasNext(); ) {Row row = (Row)rit.next();for (Iterator cit = row.cellIterator(); cit.hasNext(); ) {Cell cell = (Cell)cit.next();// Do something here}}HSSFSheet sheet = wb.getSheetAt(0);for (Iterator<HSSFRow> rit = (Iterator<HSSFRow>)sheet.rowIterator(); rit.hasNext(); ) { HSSFRow row = rit.next();for (Iterator<HSSFCell> cit = (Iterator<HSSFCell>)row.cellIterator(); cit.hasNext(); ) { HSSFCell cell = cit.next();// Do something here}}。