POI操作Excel常用方法总结

合集下载

POI操作Excel常用方法总结

POI操作Excel常用方法总结

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)rowT o2.,(short)columnT o);//合并从第rowFrom行columnFrom列3.sheet.addMergedRegion(region);// 到rowTo行columnT o 的区域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_CENTE R);//上下居中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++){< p="">11. c=r.getCell(i);12. if(c.getCellType()==Cell.CELL_TYPE_FORMULA)13. eval.evaluateFormulaCell(c);14. }15. }laCells(HSSFWorkbook wb) ,计算一个Excel文件的所有公式,用起来很方便。

POI操作excel大全

POI操作excel大全

POI操作excel大全POI操作excel大全第一讲:基本的Excel读写本文主要演示一下POI的基本操作,例如怎样读取和创建一个具体的Excel文件。

按照惯例,拿HelloWorld说事儿。

说明:本文主要内容皆包含于官方帮助手册,之所以要拿出来,出于两个原因,手册是英文的+手册是对应2.5.1的。

核心代码如下,注释部分为讲解。

这里只挑干的讲,完整的代码请参考(下载代码)。

//创建一个空白的WorkBook HSSFWorkbook wb = new HSSFWorkbook(); //基于上面的WorkBook创建属于此WorkBook 的Sheet, //3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。

H SSFSheet st = wb.createSheet(“测试页“); //创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个,//注意,尽管参数是Int类型,但是Excel最多支持65536行HSSFRow row = st.createRow(0); //创建属于上面Row的Cell,参数0可以是0~255之间的任何一个, //同样,是因为Excel最大支持的列数为256列 HSSFCell cell = row.createCell((short)0); //设置此单元格的格式为文本,此句可以省略,Excel会自动识别。

//其他还有几种常用的格式,请参考本文底部的补充部分。

c ell.setCellType(HSSFCell.CELL_TYPE_STRING); //此处是3.0.1版的改进之处,上一版可以直接setCellValue(“Hello, World!“), //但是在3.0.1里,被deprecated了。

c ell.setCellValue(new HSSFRichTextString(“Hello, World!“)); //创建一个文件输出流,指定到C盘根目录下(C盘都有吧?)//xls是Excel97-2003的标准扩展名,xx是xlsx,目前的POI能直接生产的还是xls格式,//如果此处把扩展名改成xlsx,在用Excelxx打开此文件时会报错。

POI设置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文件

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写入图片的问题。

poi excel公式处理

poi excel公式处理

在Excel中,可以使用公式来处理POI(Poor Obfuscation Implementation)文件。

POI是Apache软件基金会的一个开源项目,用于读取、写入和操作Microsoft Office格式的文件,包括Excel。

要在Excel中处理POI文件,可以遵循以下步骤:
1. 引入POI库:首先,确保您的Java项目中已引入POI库的相关依赖。

您可以在Maven或Gradle构建工具中添加POI的依赖项。

2. 创建Excel工作簿:使用POI的API,您可以创建一个新的Excel工作簿对象。

例如,在POI中,HSSFWorkbook类用于创建一个新的Excel文件。

3. 获取工作表对象:一旦您有了Excel工作簿对象,您可以使用它来获取特定的工作表对象。

例如,HSSFSheet类可用于获取一个工作表。

4. 处理单元格数据:您可以使用POI的API来读取和写入单元格数据。

例如,HSSFRow和HSSFCell类可用于获取行和单元格对象,以进行数据处理。

5. 应用公式:POI还提供了对Excel公式的支持。

您可以使用setCellFormula()方法将公式应用于单元格。

6. 保存Excel文件:完成数据处理和公式应用后,您可以使用POI的API将Excel 文件保存到指定的位置。

例如,使用HSSFWorkbook类的write()方法将工作簿对象写入文件。

通过遵循上述步骤,您可以在Java中使用POI库处理Excel文件,包括应用公式到单元格中。

这样,您可以读取、修改和生成包含公式的POI Excel文件。

1。

【POI】hutool万能工具的poi使用(Excel操作)

【POI】hutool万能工具的poi使用(Excel操作)

【POI】hutool万能⼯具的poi使⽤(Excel操作)POI技术(hutool⼯具的简单使⽤)POI: java技术,操作excel⽂档hutool-excel:常⽤poi功能,简化封装成⼯具类写出⽂档数据:(1)导出数据报表①获得能够向excel表格中输出信息对象[流]writer = ExcelUtil.getWriter("⽂件路径");注释:excel表格⽂件标准后缀:*.xls、*.xlsx② excel表格数据包含:表头:指明当前列数据的含义每⾏:多个单元格的数据;List<Object> | Map<字符串标题,Object>表格:多⾏数据。

List<Map<表头,Object数据>>③将数据写出到Excel⽂档:writer.write(list);④关闭流:writer.close();(2)向输出流中写⼊数据①创建⼀个写出的⼯具:ExcelWriter ew = ExcelUtil.getWriter();②将list多⾏数据集合写⼊:writer.write(list);③ flush,将数据写⼊到指定输出流中:writer.flush(outputStream);④关闭流:writer.close();(3)设置表格的sheet的名字writer.renameSheet("xxx")读⼊⽂档数据:①创建⼀个读⼊的⼯具:ExcelReader reader = ExcelUtil.getReader("⽂件路径");②读取⾥⾯的数据:List<Map<String,Object>> list = reader.readAll();③关闭流:reader.close();实例代码:导出:准备:导⼊POI的jar以及hutool的jar①⽅式⼀:(表格信息写到对应的⽂件路径)ExcelUtil.getWriter("⽂件路径"); //直接写到⽂件⾥②⽅式⼆:(表格信息写到特定的输出流⾥)List<Person> list = new ArrayList<Person>();persons.add(new Person("1001", "黄浩", 1, 18, "233456789", "郑州"));persons.add(new Person("1002", "杨宁", 1, 18, "233456789", "郑州"));persons.add(new Person("1003", "洪诗鹏", 1, 18, "233456789", "郑州"));// 重要将数据转化为hutool-excel,能够直接写出的数据结构:List<Map<String,Object>>// 创建⼀个存储多⾏数据的listList<Map<String, Object>> persons = new ArrayList<Map<String, Object>>();for (Person person : list) {// 每个person信息,代表⼀⾏数据:Map<String,person的属性>Map<String, Object> map = new LinkedHashMap<String, Object>();map.put("编号", person.getId());map.put("名字", person.getName());map.put("年龄", person.getAge());map.put("地址", person.getAddress());persons.add(map); // 将当前⾏的数据,加⼊persons}ExcelWriter writer = ExcelUtil.getWriter("D:/person.xlsx");// ①创建写出数据到⽂档中的⼯具writer.renameSheet("联系⼈信息表"); //设置sheet的名字writer.write(persons); // ②将数据写出到⽂档导出⼯具中writer.flush(输出流);//输出流:可以是⽂件输出流,也可以是控制器的响应流进⾏下载writer.close(); // ③关闭流导⼊:①创建⼀个读⼊的⼯具:ExcelReader reader = ExcelUtil.getReader("D:/person.xlsx");②读取⾥⾯的数据:List<Map<String, Object>> list = reader.readAll();③关闭流:reader.close();。

JAVA中poi操作excel合并单元格的技巧,以及easypoi,注解@Excel的操作

JAVA中poi操作excel合并单元格的技巧,以及easypoi,注解@Excel的操作

JAVA中poi操作excel合并单元格的技巧,以及easypoi,注解@Excel的操作1.合并单元格,合并⾏,列合并⾏的时候,默认是把合并单元格的第⼀个单元格的内容作为合并后的内容。

所以如何想设置合并后的内容,先设置⼀下第⼀个单元格的内容,再合并就可以;XSSFSheet sheet = workbook.createSheet("表名称");CellRangeAddress cra = new CellRangeAddress(起始⾏,结束⾏ , 起始列, 结束列);sheet.addMergedRegion(cra);合并的代码就是这样,把参数写好就⾏,⾄于内部是什么原理,就不知道了。

合并列和这个也差不多,就是改⼀下参数就可以了。

2.修改单元格的长度和宽度只能整⾏整列的修改,不能中间突然长宽不⼀样的单元格。

XSSFSheet sheet = workbook.createSheet("表名称");XSSFRow row = sheet.createRow("这个是⾏号");//设置⾏⾼row.setHeightInPoints(35);//设置列宽sheet.setColumnWidth(0, 10 * 256);设置列宽的参数分别为,需要设置列的列号,表⽰第⼏列,后⾯⼀个参数是设置宽度,⾄于为什么要乘以256,是因为这个参数的单位是1/256个字符,所以乘以256之后,就代表⽐如我所⽰的就是10个字符了。

3.最后,操作完后⼀定要记得“保存”OutputStream out;out = new FileOutputStream(filePath);//⽂件保存地址workbook.write(out);out.close();也就是要write⼀下。

4.最近发现⽤注解的⽅式导出excel更加⽅便快捷官⽹教程链接地址:说⽼实话,这官⽹的教程确实好强。

关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结

关于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常用方法

poi常用方法

poi常用方法Poi是指POI(Poor Obfuscation Implementation),是一份Apache下开源的Java组件,主要用于操作Excel格式的文档。

Poi功能丰富,应用广泛,下面将围绕poi常用方法给大家做一篇介绍。

1.导入poi包在项目工程中,我们需要在pom.xml中引用poi相关的jar包,也可以在项目java源码中手动引用。

如果不想下载poi组件,也可以根据maven的配置文件向maven中心仓库请求自动下载。

2.创建工作簿使用poi操作Excel文档,第一步需要创建一个工作簿对象。

我们可以通过创建一个HSSFWorkbook对象或XSSFWorkbook对象来实现。

```HSSFWorkbook wb = new HSSFWorkbook();//创建xls文件XSSFWorkbook wb = new XSSFWorkbook();//创建xlsx文件```3.创建工作表Excel文档通常是由多个工作表组成,我们通过POI也可以创建工作表。

在创建工作簿之后,同样可以创建一个或多个工作表。

```HSSFSheet sheet = wb.createSheet();//创建xls工作表XSSFSheet sheet = wb.createSheet();//创建xlsx工作表```4.创建单元格Excel文档中常常有很多单元格,每个单元格都有固定的行和列。

POI也可以创建或修改单元格。

```HSSFRow row = sheet.createRow(0);//创建第一行HSSFCell cell = row.createCell(0);//创建第一列第一个单元格cell.setCellValue("这是一个单元格的值");//设置单元格的值```5.读取单元格我们可以使用POI来读取Excel文档中的单元格。

使用一个HSSFCell 对象可以读取一行数据的值。

POI操作Excel常用方法总结

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文件的所有公式,用起来很方便。

poi操作excel(读取)

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数据,取得表单数据。

POI操作大全(动态合并单元格为单元格生成一个自定义的数据显示格式自定义公式计算结果生

POI操作大全(动态合并单元格为单元格生成一个自定义的数据显示格式自定义公式计算结果生

POI操作大全(动态合并单元格为单元格生成一个自定义的数据显示格式自定义公式计算结果生POI是一个用于操作Microsoft Office格式文件的Java库。

通过POI库,可以实现对Excel、Word和PowerPoint文件的读写操作。

本文将介绍POI库的一些常用操作,包括动态合并单元格、为单元格生成自定义的数据显示格式、自定义公式计算结果等。

一、动态合并单元格在Excel中,可以将多个相邻的单元格合并成一个单元格,以便显示更大的数据块。

POI库可以很方便地实现对合并单元格的操作。

1.创建合并区域:```javaCellRangeAddress region = new CellRangeAddress(rowStart, rowEnd, colStart, colEnd);sheet.addMergedRegion(region);```其中,rowStart和rowEnd表示合并区域的起始行和结束行,colStart和colEnd表示合并区域的起始列和结束列。

2.设置合并单元格的值:```javaCell cell = sheet.getRow(rowStart).createCell(colStart);cell.setCellValue("合并单元格的值");```这里,我们取合并区域的起始行和起始列,设置单元格的值。

二、为单元格生成一个自定义的数据显示格式在Excel中,可以对单元格的值设置格式,以便以不同的方式展示数据。

POI库提供了设置单元格格式的方法。

1.创建格式对象:```javaCellStyle cellStyle = workbook.createCellStyle(;```2.设置格式:```javaDataFormat dataFormat = workbook.createDataFormat(;short format = dataFormat.getFormat("自定义格式");cellStyle.setDataFormat(format);```其中,"自定义格式"是Excel中的一种格式化字符串。

poi 单元格时间格式

poi 单元格时间格式

poi 单元格时间格式POI是一款流行的Java库,用于处理 Microsoft Office 格式的文档。

在处理 Excel 文档时,常常需要对单元格的时间格式进行操作。

Excel 中有多种时间格式,比如日期时间、日期、时间等等。

对于单元格的时间格式,POI 提供了一些快捷方法,可以方便地进行格式化和解析。

下面介绍几个常用的 POI 时间格式方法:1. DateUtil.isCellDateFormatted(Cell cell)该方法用于判断单元格是否为日期格式。

如果是日期格式,则返回 true,否则返回 false。

2. DateUtil.getJavaDate(double value)该方法将 Excel 中表示日期时间的数字转换为 Java 中的日期对象。

需要注意的是,Excel 中表示日期时间的数字是一个浮点数,整数部分表示日期,小数部分表示时间。

3. DateUtil.getExcelDate(Date date)该方法将 Java 中的日期对象转换为 Excel 中的日期时间数字。

4. CellStyle.setDataFormat(int format)该方法用于设置单元格的时间格式。

参数 format 是一个整数,表示时间格式。

常用的时间格式有以下几种:yyyy-MM-dd hh:mm:ss // 日期时间格式,如 2021-05-0112:00:00yyyy-MM-dd // 日期格式,如 2021-05-01hh:mm:ss // 时间格式,如 12:00:00以上是几个常用的 POI 时间格式方法,可以方便地进行 Excel 中时间格式的操作。

poi处理表格注意事项

poi处理表格注意事项

POI处理表格的注意事项与技巧
使用POI处理表格时,有以下几点需要注意:
1.内存管理:如果只需要获取sheet信息,建议使用流模式打开文件,这样可
以减少内存消耗。

2.文件校验:上传的文件需要校验,以防止Excel包含异常的缓存文件。

这可
以通过先判断是否为“zip炸弹”,再解压文件到本地,解压时刻获取文件大小进行校验的方式实现。

同时,应限制解压循环次数和文件个数。

3.分页符问题:在HSSFSheet类中,如果调用setRowBreak方法设置分页符
的sheet是本来就有的,并且没有在里面插入过分页符,那么POI会抛出空指针的异常。

解决这个问题的方法是在Excel里给这个sheet先插入一个分页符,用POI打开后再将其删除。

4.sheet重命名:尽量不要重命名sheet,因为这可能会引起文件报错。

5.安全问题:为了防止Excel解析时遇到zip炸弹,可以使用
ZipSecureFile.setMinInflateRatio(-1.0d)方法设置最小膨胀比例。

遵循这些注意事项可以有效地提高POI处理表格的效率和准确性。

使用POI进行Excel操作的总结一——创建Workbook,Sheet,Row以及Cell

使用POI进行Excel操作的总结一——创建Workbook,Sheet,Row以及Cell

使⽤POI进⾏Excel操作的总结⼀——创建Workbook,Sheet,Row以及Cell前段时间,看在其他的⽹站上给出Excel⽂档的导⼊与导出操作,感觉很酷的样⼦,所以就学习了⼀下如何使⽤POI进⾏Excel的操作,现在对之前的学习过程进⾏⼀个总结。

⼀、现在普遍使⽤的Excel⽂档有xls以及xlsx这两种Excel⽂档,其中xls格式的Excel⽂档⼜分为5.0/95⼯作簿以及97-2003⼯作簿这两种。

需要注意的是,由于5.0/95⼯作簿的版本太低,现在的POI⽂档不再⽀持这种类型的Excel⽂档的读取⼯作,当试图读取这种类型的Excel⽂档的时候,POI会抛出⼀个异常(OldExcelFormatException)。

我现在使⽤的POI是3.14版本。

⼆、Workbook的创建1、由于Excel中存在xls以及xlsx这两种格式,所以创建⽅式也有所不同。

其中对于xls格式的⽂档,需要使⽤HSSFWorkbook来创建⼯作簿对象,⽽对于xlsx格式的Excel⽂档,则需要使⽤XSSFWrokbook来创建⼯作簿。

有⼀点需要注意的是,HSSFWorkbook与XSSFWorkbook 这两个类其实都是Workbook接⼝的⼀个实现类。

好了,下⾯就是创建⼯作簿对象的代码://创建⼀个不存在的excel⽂件private static Workbook createWorkbookIfNotExist(String fileName) throws Exception {Workbook wb = null;if(fileName.endsWith(".xls")) {wb = new HSSFWorkbook();} else if(fileName.endsWith(".xlsx")) {wb = new XSSFWorkbook();} else {throw new Exception("⽂件类型错误!");}try{OutputStream output = new FileOutputStream(fileName);wb.write(output);}catch(FileNotFoundException e) {System.out.println("⽂件创建失败,失败原因为:" + e.getMessage());throw new FileNotFoundException();}System.out.println(fileName + "⽂件创建成功!");return wb;}//创建⼀个新的或者已存在的Excel⽂档的Workbookpublic static Workbook createWorkbook(String fileName) throws Exception {InputStream input = null;Workbook wb = null;try{input = new FileInputStream(fileName);wb = WorkbookFactory.create(input);} catch(FileNotFoundException e) {System.out.println("要打开的⽂件不存在,正试图创建该⽂件,请稍后……!");wb = createWorkbookIfNotExist(fileName);} catch(OldExcelFormatException e) {System.out.println("⽂件打开失败,原因:要打开的Excel⽂件版本过低!");throw new OldExcelFormatException("⽂件版本过低");} finally {if(input != null) {input.close();}}return wb;}2、创建Sheet的时候,同样的也存在HSSFSheet以及XSSHSheet这两种类型。

java通过POI技术操作Excel(2)----模板读取,录入数据

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;这三步来进⾏完成了。

POI操作常用方法

POI操作常用方法

POI操作常用方法POI(Poor Obfuscation Implementation)是一种用于操作Microsoft Office文件的Java库。

它提供了对Excel、Word和PowerPoint等文件的创建、读写和修改的功能。

POI操作常用的方法包括文件的创建、读取和写入、单元格的操作、格式设置、图表的创建和修改等。

1.文件的创建与读取:- 创建一个Excel文件:```Workbook workbook = new XSSFWorkbook(; // 创建一个新的Excel 文件Sheet sheet = workbook.createSheet("Sheet1"); // 创建一个名为Sheet1的工作表```- 读取一个Excel文件:```InputStream inputStream = newFileInputStream("path/to/file.xlsx");Workbook workbook = new XSSFWorkbook(inputStream); // 读取Excel文件Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表```2.单元格的操作:-创建一个单元格并设置值:```Row row = sheet.createRow(0); // 创建第一行Cell cell = row.createCell(0); // 创建第一列cell.setCellValue("Hello World"); // 设置单元格的值```-获取单元格的值:```Row row = sheet.getRow(0); // 获取第一行Cell cell = row.getCell(0); // 获取第一列String value = cell.getStringCellValue(; // 获取单元格的值```3.格式设置:-设置单元格的样式:```CellStyle style = workbook.createCellStyle(; // 创建样式对象Font font = workbook.createFont(; // 创建字体对象font.setBold(true); // 设置字体为粗体style.setFont(font); // 将字体应用于样式cell.setCellStyle(style); // 将样式应用于单元格```-设置单元格的格式:```DataFormat format = workbook.createDataFormat(; // 创建数据格式对象CellStyle style = workbook.createCellStyle(; // 创建样式对象style.setDataFormat(format.getFormat("#,#.00")); // 设置数据的格式,如数字格式为千分位cell.setCellStyle(style); // 将样式应用于单元格```4.图表的创建与修改:-创建一个柱状图:```Drawing<?> drawing = sheet.createDrawingPatriarch(; // 创建图纸对象ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15); // 定义图表的位置和大小Chart chart = drawing.createChart(anchor); // 创建图表对象ChartAxis bottomAxis =chart.getChartAxisFactory(.createCategoryAxis(AxisPosition.BOTTO M); // 创建X轴对象ChartAxis leftAxis =chart.getChartAxisFactory(.createValueAxis(AxisPosition.LEFT); // 创建Y轴对象。

poi操作excel,复制sheet,复制行,复制单元格,复制style

poi操作excel,复制sheet,复制行,复制单元格,复制style

poi操作excel,复制sheet,复制⾏,复制单元格,复制style 缘起最近写⼀个程序,需要操作excel,遂稍微深⼊了解下poi从操作,在需要复制⼀个sheet的时候,找到三份资料问题如果在copy⼀个cell的时候,需要把样式也copy过去,怎么办,会怎样呢?如果像第三份资料中所做,会创建太多的style,⽽这些style⼜是重复的 ,毫⽆意义,数据多了还报错如果像第⼆份资料中所做,前提是同⼀个workbook,也不存在copy style 的问题,只不过是不同的cell引⽤相同的style⽽已如果像第⼀份资料所做,他⾃⼰都注释掉了,因为报错如何解决思路相同的book中,不需要copy不同的book中,styleTable应该不⼀致,copy的时候,在⽬标book中创建,最后返回两个book中的style index的映射关系代码暂时没测试过,写出来就迫不及待要分享了。

import ermodel.CellStyle;import ermodel.Workbook;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/*** 提供常⽤excel操作<br>* <ul>* <li></li>* </ul>*/public class ExcelOperationUtil {private static Logger logger = LoggerFactory.getLogger(ExcelOperationUtil.class);/*** 把⼀个excel中的styleTable复制到另⼀个excel中* @return StyleMapping 两个⽂件中styleTable的映射关系* @see StyleMapping*/public static StyleMapping copyCellStyle(Workbook srcBook, Workbook desBook){if (null == srcBook || null == desBook) {throw new ExcelExecption("源excel 或⽬标excel 不存在");}if (srcBook.equals(desBook)) {throw new ExcelExecption("不要使⽤此⽅法在同⼀个⽂件中copy style");}logger.debug("src中style number:{}, des中style number:{}", srcBook.getNumCellStyles(), desBook.getNumCellStyles());short[] src2des = new short[srcBook.getNumCellStyles()];short[] src2des = new short[srcBook.getNumCellStyles()];short[] des2src = new short[desBook.getNumCellStyles() + srcBook.getNumCellStyles()];for(short i=0;i<srcBook.getNumCellStyles();i++){//建⽴双向映射CellStyle srcStyle = srcBook.getCellStyleAt(i);CellStyle desStyle = desBook.createCellStyle();src2des[srcStyle.getIndex()] = desStyle.getIndex();des2src[desStyle.getIndex()] = srcStyle.getIndex();//复制样式desStyle.cloneStyleFrom(srcStyle);}return new StyleMapping(des2src, src2des);}/*** 存放两个excel⽂件中的styleTable的映射关系,以便于在复制表格时,在⽬标⽂件中获取到对应的样式*/public static class StyleMapping {/****/private short[] des2srcIndexMapping;/****/private short[] src2desIndexMapping;/*** 不允许其他类创建此类型对象*/private StyleMapping() {}private StyleMapping(short[] des2srcIndexMapping, short[] src2desIndexMapping) {this.des2srcIndexMapping = des2srcIndexMapping;this.src2desIndexMapping = src2desIndexMapping;}public short srcIndex(short desIndex) {if (desIndex < 0 || desIndex >= this.des2srcIndexMapping.length) {throw new ExcelExecption("索引越界:源⽂件styleNum=" + this.des2srcIndexMapping.length + " 访问位置=" + desIndex); }return this.des2srcIndexMapping[desIndex];}/*** 根据源⽂件的style的index,获取⽬标⽂件的style的index* @param srcIndex 源excel中style的index* @return desIndex ⽬标excel中style的index*/public short desIndex(short srcIndex) {if (srcIndex < 0 || srcIndex >= this.src2desIndexMapping.length) {throw new ExcelExecption("索引越界:源⽂件styleNum=" + this.src2desIndexMapping.length + " 访问位置=" + srcIndex); }return this.src2desIndexMapping[srcIndex];}}}完善代码⼯作忙了⼏天,终于可以回头把这件事结束掉了<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-scratchpad</artifactId><version>3.17</version></dependency>为啥贴出依赖?因为我⼀开始⽤3.8版本,如果是xls就可以,如果是xlsx死活不⾏,最后,换掉版本就可以了。

POI操作Excel

POI操作Excel

POI操作Excel----------(转载)java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境。

然而由于老外的英语只有26个字母,有些情况下,一些程序员用8 位的byte处理,一不小心就去掉了CJK的高位。

或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多java应用在CJK的处理上很烦恼。

还好在POI HSSF中考虑到这个问题,可以设置encoding为双字节。

POI可以到下载到。

编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。

实际运行时,需要有poi包就可以了。

如果用Jakarta ant编译和运行,下载apache Jakarta POI的release中的src 包,它里面已经为你生成好了build文件了。

只要运行ant就可以了(ant 的安装和使用在此不说了)。

如果是用Jbuilder 运行,请在新建的项目中加入poi 包。

以Jbuilder6为例,选择Tools菜单项的config libraries...选项,新建一个lib。

在弹出的菜单中选择poi包,如这个jakarta-poi-1.5.1-final- 20020820.jar,把poi添加到jbuilder中。

然后,右键点击你的项目,在project 的properties菜单中path的 required Libraries中,点add,添加刚才加入到jbuilder中的poi到你现在的项目中。

如果你仅仅是为了熟悉POI hssf的使用,可以直接看POI的samples包中的源代码,并且运行它。

hssf的各种对象都有例程的介绍。

hssf提供的例程在ermodel.examples包中,共有14个,生成的目标xls 都是workbook.xls。

如果你想看更多的例程,可以参考hssf的Junit test cases,在poi的包的源代码中有。

POI对Excel表格操作研

POI对Excel表格操作研

1
只需要用工作表调用合并单元格的方法: 只 需 sheet 表 调 用 合 并 单 元 格 的 方 法
sheet.addMergedRegion(new
合 并
CellRangeAddress(

1, //开始行号
元 格Βιβλιοθήκη 1, //终止行号1, //开始列号
WritableSheet.mergeCells( int m, //开始列号 int n, //开始行号 int p, //终止列号 int q//终止行号
wb.addPicture(bytes,
Workbook.PICTURE_TYPE_JPEG); File file=new
CreationHelper helper = File("D:\\1.png");//仅支持png格
wb.getCreationHelper();
式图片

Drawing drawing = sheet.
XSSFWorkbook(f);
Sheet
读 操
XSSFSheet sheet =
sheet=book.getSheet(0);

workbook.getSheet("Sheet");// Cell cell1=sheet.getCell(0,0);
XSSFRow row =
String result=cell1.getContents();
import jxl.*;

XSSFRow row
WritableWorkbook book=
操 作
=sheet.createRow(65536);
Workbook.createWorkbook(new
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

POI操作Excel常用方法总结一、POI简介Jakarta POI 是apache的子项目,目标是处理ole2对象。

它提供了一组操纵Windows文档的Java API目前比较成熟的是HSSF接口,处理MS Excel(97-2003对象。

它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

二、HSSF概况HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。

前者很好理解,后者比较抽象,但操作效率要高得多。

三、POI EXCEL文档结构类HSSFWorkbook excel文档对象HSSFSheet excel的sheetHSSFRow excel的行HSSFCell excel的单元格HSSFFont excel字体HSSFName 名称HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾HSSFCellStyle cell样式HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表四、EXCEL常用操作方法1、得到Excel常用对象POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:\test.xls"));HSSFWorkbook wb = new HSSFWorkbook(fs);//得到Excel工作簿对象HSSFSheet sheet = wb.getSheetAt(0); //得到Excel工作表对象HSSFRow row = sheet.getRow(i);//得到Excel工作表的行HSSFCell cell = row.getCell((short) j);//得到Excel工作表指定行的单元格cellStyle = cell.getCellStyle();//得到单元格样式2、建立Excel常用对象HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行cellStyle = wb.createCellStyle();//创建单元格样式row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行的单元格row.createCell((short)0).setCellValue(1); //设置Excel工作表的值3、设置sheet名称和单元格内容wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16);cell.setEncoding((short) 1);cell.setCellValue("单元格内容");4、取得sheet的数目wb.getNumberOfSheets()5、根据index取得sheet对象HSSFSheet sheet = wb.getSheetAt(0);6、取得有效的行数int rowcount = sheet.getLastRowNum();7、取得一行的有效单元格个数row.getLastCellNum();8、单元格值类型读写cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型cell.getNumericCellValue();//读取为数值类型的单元格内容9、设置列宽、行高sheet.setColumnWidth((short)column,(short)width);row.setHeight((short)height);10、添加区域,合并单元格Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo ,(short)columnTo);//合并从第rowFrom行columnFrom列sheet.addMergedRegion(region);// 到rowTo行columnTo的区域//得到所有区域sheet.getNumMergedRegions()11、保存Excel文件FileOutputStream fileOut = new FileOutputStream(path);wb.write(fileOut);12、根据单元格不同属性返回字符串数值public String getCellStringValue(HSSFCell cell) {String cellValue = "";switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_STRING://字符串类型cellValue = cell.getStringCellValue();if(cellValue.trim().equals("")||cellValue.trim().length()<=0)cellValue=" ";break;case HSSFCell.CELL_TYPE_NUMERIC: //数值类型cellValue = String.valueOf(cell.getNumericCellValue());break;case HSSFCell.CELL_TYPE_FORMULA: //公式cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);cellValue = String.valueOf(cell.getNumericCellValue());break;case HSSFCell.CELL_TYPE_BLANK:cellValue=" ";break;case HSSFCell.CELL_TYPE_BOOLEAN:break;case HSSFCell.CELL_TYPE_ERROR:break;default:break;}return cellValue;}13、常用单元格边框格式HSSFCellStyle style = wb.createCellStyle();style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框14、设置字体和内容位HSSFFont f = wb.createFont();f.setFontHeightInPoints((short) 11);//字号f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗style.setFont(f);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中style.setRotation(short rotation);//单元格内容的旋转的角度HSSFDataFormat df = wb.createDataFormat();style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式cell.setCellFormula(string);//给单元格设公式style.setRotation(short rotation);//单元格内容的旋转的角度cell.setCellStyle(style);15、插入图片//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));ImageIO.write(bufferImg,"jpg",byteArrayOut);//读进一个excel模版FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");fs = new POIFSFileSystem(fos);//创建一个工作薄HSSFWorkbook wb = new HSSFWorkbook(fs);HSSFSheet sheet = wb.getSheetAt(0);HSSFPatriarch patriarch = sheet.createDrawingPatriarch();HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10 );patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbo ok.PICTURE_TYPE_JPEG));16、调整工作单位置HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet("format sheet");HSSFPrintSetup ps = sheet.getPrintSetup();sheet.setAutobreaks(true);ps.setFitHeight((short)1);ps.setFitWidth((short)1);17、设置打印区域HSSFSheet sheet = wb.createSheet("Sheet1");wb.setPrintArea(0, "$A$1:$C$2");18、标注脚注HSSFSheet sheet = wb.createSheet("format sheet");HSSFFooter footer = sheet.getFooter()footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() ); 19、在工作单中清空行数据,调整行位置HSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet("row sheet");// Create various cells and rows for spreadsheet.// Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)sheet.shiftRows(5, 10, -5);20、选中指定的工作表HSSFSheet sheet = wb.createSheet("row sheet");heet.setSelected(true);21、工作表的放大缩小HSSFSheet sheet1 = wb.createSheet("new sheet");sheet1.setZoom(3,4); // 75 percent magnification22、头注和脚注HSSFSheet sheet = wb.createSheet("new sheet");HSSFHeader header = sheet.getHeader();header.setCenter("Center Header");header.setLeft("Left Header");header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");23、自定义颜色HSSFCellStyle style = wb.createCellStyle();style.setFillForegroundColor(HSSFColor.LIME.index);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);HSSFFont font = wb.createFont();font.setColor(HSSFColor.RED.index);style.setFont(font);cell.setCellStyle(style);24、填充和颜色设置HSSFCellStyle style = wb.createCellStyle();style.setFillBackgroundColor(HSSFColor.AQUA.index);style.setFillPattern(HSSFCellStyle.BIG_SPOTS);HSSFCell cell = row.createCell((short) 1);cell.setCellValue("X");style = wb.createCellStyle();style.setFillForegroundColor(HSSFColor.ORANGE.index);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cell.setCellStyle(style);// Orange "foreground", foreground being the fill foreground not the font color.25、强行刷新单元格公式HSSFFormulaEvaluator eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);private static void updateFormula(Workbook wb,Sheet s,int row){Row r=s.getRow(row);Cell c=null;FormulaEcaluator eval=null;if(wb instanceof HSSFWorkbook)eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);else if(wb instanceof XSSFWorkbook)eval=new XSSFFormulaEvaluator((XSSFWorkbook) wb);for(int i=r.getFirstCellNum();i<r.getLastCellNum();i++){c=r.getCell(i);if(c.getCellType()==Cell.CELL_TYPE_FORMULA)eval.evaluateFormulaCell(c);}}说明:FormulaEvaluator提供了evaluateFormulaCell(Cell cell)方法,计算公式保存结果,但不改变公式。

相关文档
最新文档