PowerBI技巧之POI生成EXCEL,公式不自动执行的有关问题
ecle不计算函数

Excel中的公式或者函数不计算的问题,以下是一些可能的原因和解决方法:
1. 公式输入错误:
检查公式中是否包含拼写错误、缺少括号或者使用了无效的函数名。
确保所有的引用单元格都是正确的,并且在工作表的范围内。
2. 公式依赖的数据未更新:
如果公式依赖的其他单元格数据发生变化但未更新,公式可能不会重新计算。
尝试手动更新所有相关单元格或使用“Ctrl+Alt+F9”强制重新计算所有公式。
3. 计算选项设置问题:
在Excel的“文件”->“选项”->“公式”中,检查计算选项是否设置为自动。
如果不是,请将其设置为“自动”以使公式在数据更改时自动计算。
4. 循环引用:
如果公式中存在循环引用(即公式直接或间接地引用了自身),Excel可能无法计算。
在这种情况下,你需要检查并修复循环引用。
5. 公式中使用了文本格式的数字:
如果公式中使用的数字实际上是文本格式的,Excel可能无法正确计算。
确保所有参与计算的数值都是数字格式。
6. Excel性能问题:
如果你的Excel工作簿很大或者包含了大量复杂公式,Excel可能由于性能问题而无法及时计算。
尝试关闭不必要的工作表或者优化公式。
如果以上方法都不能解决问题,你可能需要提供更具体的情况以便进行更深入的诊断和解决方案。
POI导出excel执行自动求和

POI导出excel执⾏⾃动求和1、核⼼代码/*设置单元格样式*/XSSFCellStyle cellStyle = workbook.createCellStyle();// 单元格样式cellStyle.setWrapText(true);// ⾃动换⾏cellStyle.setAlignment(HorizontalAlignment.CENTER);// ⽔平居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);Font font = workbook.createFont();font.setFontName("仿宋_GB2312");font.setFontHeightInPoints((short) 9);cellStyle.setFont(font);int totalCell = sheet.getRow(3).getLastCellNum();// 获取第四⾏列的数量Cell cell;// 单元格String colString;//长度转成ABC后的列String sumString;//求和公式for (int i = 2; i < totalCell; i++) {// 我从第⼆列开始每列都执⾏求和操作因此i=2cell = row.createCell(i);// 创建单元格cell.setCellStyle(cellStyle);// 设置单元格样式colString = CellReference.convertNumToColString(i); //长度转成ABC列//求和公式求i9⾄i12单元格的总和sumString = "SUM(" + colString + "9:" + colString + 12 + ")";cell.setCellFormula(sumString);// 把公式塞⼊合计列}2、前⾯的代码不起作⽤的话,建议在下⾯这⾏代码:workbook.write(out);// 输出Excel内容,⽣成Excel⽂件之前,添加这个语句:workbook.setForceFormulaRecalculation(true);// 执⾏公式。
poi事件模式解析excel 2007

poi事件模式解析excel 2007摘要:1.POI事件模式简介2.Excel 2007简介3.POI事件模式在Excel 2007中的应用4.具体实例解析5.总结与建议正文:随着信息化时代的到来,数据处理和分析成为了各行各业必备的技能。
在这个过程中,Microsoft Excel 2007作为一款功能强大的电子表格软件,被广泛应用于各种领域。
本文将为您介绍Excel 2007中的一个重要概念——POI (Product Object Model)事件模式,并通过具体实例为您解析如何在Excel 2007中运用POI事件模式。
1.POI事件模式简介POI事件模式是一种基于COM(Component Object Model)的技术,它允许开发人员创建自定义对象,并在Excel中响应特定事件。
通过使用POI 事件模式,您可以自定义Excel的工作簿、工作表和单元格行为,从而满足各种业务需求。
2.Excel 2007简介Excel 2007是Microsoft Office System的一部分,它具有丰富的功能,可以轻松地进行数据录入、计算、分析和可视化。
在Excel 2007中,用户可以通过VBA(Visual Basic for Applications)编程语言和API(应用程序编程接口)自定义和扩展Excel的功能。
3.POI事件模式在Excel 2007中的应用在Excel 2007中,POI事件模式主要应用于以下几个方面:- 工作簿事件:例如打开、关闭、保存工作簿等。
- 工作表事件:例如单元格内容变化、选区变化等。
- 单元格事件:例如单元格内容变化、鼠标事件等。
通过监听和处理这些事件,您可以实现自定义功能,例如:自动填充公式、监控单元格内容变化等。
4.具体实例解析以下将以一个简单的实例来说明如何在Excel 2007中使用POI事件模式:假设我们希望在一个新建的工作簿中,当用户在A1单元格中输入内容时,自动将内容复制到B1单元格。
POI生成excel,自定义excel样式

POI⽣成excel,⾃定义excel样式POI创建excel有三种⽅式,分别为HSSFWorkbook、XSSFWorkbook、SXSSFWorkbookHSSFWorkbook最多只能导出65533⾏数据,扩展名为xlsXSSFWorkbook为了解决HSSFWorkbook⾏数限制问题,最⼤可导出1048576⾏16384列,扩展名为xlsx,但是数据过⼤会导致内存占⽤过多引⼊内存溢出等问题SXSSFWorkbook可以通过程序设置,将超过指定⾏数的数据直接持久化到磁盘中,从⽽不影响内存poi的⾏数和列数是从0开始,这⾥在合并单元格的时候需要注意下⾯通过代码实现创建excel、sheet、row、cell、单元格样式、合并单元格//创建excelSXSSFWorkbook wb = new SXSSFWorkbook();//压缩临时⽂件wb.setCompressTempFiles(true);//定义⽂件名,如果需要⽂件夹,需要先创建⽂件夹,linux路径为/path,windows路径为\\pathString fileName = "xxx.xlsx";File file = new File(fileName);if (!file.exists()) {file.createNewFile();}createExcel(SXSSFWorkbook wb);//转化成⽂件输出流输出到⽂件名的路径中⽣成excelOutputStream out = new FileOutputStream(file);wb.write(out);out.close();//删除写⼊磁盘中的临时⽂件,最好放到finally中wb.dispose();public void createExcel(){SXSSFSheet sheet = wb.createSheet("sheet名");//设置sheet页中的每⾏的宽度,可以根据下标进⾏定制for(int i = 0; i < 5; i++){sheet.setColumnWidth(i, 5000);}//创建⾏SXSSFRow row = sheet.createRow(rowNum++);//创建⾏内的单元格,需要从第⼀个单元格开始设置值,可以为null,⼀⾏多个值可以通过循环设置每⾏的值SXSSFCell cell=row.createCell(i);cell.setCellValue("单元格内容");//设置单元格样式,如果对excel的样式有要求,如字体、边框、填充⾊等等cell.setCellStyle(createStyle(wb));}public CellStyle createStyle(SXSSFWorkbook wb){CellStyle style = wb.createCellStyle();//设置字体style.setFont(getFont(wb));//设置对齐⽅式style.setAlignment(HorizontalAlignment.CENTER);//设置垂直对齐⽅式style.setVerticalAlignment(VerticalAlignment.CENTER);//设置是否锁定style.setLocked(true);//设置是否⾃动换⾏style.setWrapText(false);//设置边框style.setBorderBottom(BorderStyle.NONE);style.setBorderLeft(BorderStyle.NONE);style.setBorderTop(BorderStyle.NONE);style.setBorderRight(BorderStyle.NONE);return style;}public Font getFont(SXSSFWorkbook wb){Font font = workwbbook.createFont();font.setFontName("华⽂彩云");font.setFontHeightInPoints((short) 60);font.setBold(true);font.setColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());return font;}//合并单元格//开始⾏结束⾏第⼏列颜⾊public void mergeCell(SXSSFWorkbook workbook, SXSSFSheet sheet, int startRowIndex, int endRowIndex, int columnIndex, Short color){//设置合并单元格的样式,不然合并后可能会丢失边框,具体可以⾃⼰定义CellStyle style = workbook.createStyle();if(color != null) {//填充单元格style.setFillPattern(FillPatternType.SOLID_FOREGROUND);//设置单元格背景⾊,可以参考HSSFColor.HSSFColorPredefined.BLACK.getIndex()style.setFillForegroundColor(color);}for(int i = startRowIndex; i <= endRowIndex; i++) {Row row = sheet.getRow(i);if(row == null){break;}Cell cell = row.getCell(columnIndex);cell.setCellStyle(style);}}最终效果。
Excel表格函数不能用怎么解决

Excel表格函数不能用怎么解决有时候EXCEL中数据做了修改,突然发现公式不能计算最新正确结果了。
你说怪不怪。
那么Excel表格函数不可以用怎样解决呢?今天,店铺就教大家在Excel中公式突然不能计算了的解决方法,欢迎大家来到学习。
Excel中公式突然不能计算的解决方法拿个基础例子说明了,表中前三列加起来,用公式计算得出第四列合计。
目前数据是正确的。
修改了AB的数据,结果合计还是没变化。
这种情况出现往往和你的一些什么设置有关。
继续观察,双击单元格,看到公式的确还在,并且公式是正确的。
经过刚才的双击公式后,发现能计算出最新的正确结果了。
继续反复测试发现,修改数据后必须双击一下公式单元格才能计算。
以上现象,一般是因为接下来介绍的设置造成的。
以excel2003为例。
点工具菜单中的选项。
在“重新计算”标签中。
检查你的电脑设置。
默认应该是“自动重算”这个设置。
如果改成手动重算,就会出现本例的故障。
那么为什么要有这个设置呢?这不是自找麻烦吗?这个说来话长,暂且这么理解,存在就有存在的道理。
有时候excel的文件数据公式较多,如果都是自动计算的话,反复计算影响工作。
那么就需要合理设置成手动计算,等确定修改好公式数据什么的以后,在改回来。
Excel表格使用秘诀一、让不同类型数据用不同颜色显示在工资表中,如果想让大于等于2000元的工资总额以“红色”显示,大于等于1500元的工资总额以“蓝色”显示,低于1000元的工资总额以“棕色”显示,其它以“黑色”显示,我们可以这样设置。
1.打开“工资表”工作簿,选中“工资总额”所在列,执行“格式→条件格式”命令,打开“条件格式”对话框。
单击第二个方框右侧的下拉按钮,选中“大于或等于”选项,在后面的方框中输入数值“2000”。
单击“格式”按钮,打开“单元格格式”对话框,将“字体”的“颜色”设置为“红色”。
2.按“添加”按钮,并仿照上面的操作设置好其它条件(大于等于1500,字体设置为“蓝色”;小于1000,字体设置为“棕色”)。
2021年EX ___L表公式不能计算的解决方法

ex ___l表公式不能计算的解决方法
中经常需要使用到公式进行计算,如果遇到公式不能计算的问题
具体该如何解决呢?下面是由 ___ ___的ex ___l表公式不能计算的
解决方法,以供大家阅读和学习。
公式不能计算解决步骤1:拿个基础例子说明了,表中前三列加
起来,用公式计算得出第四列合计。目前数据是正确的。
公式不能计算解决步骤2:修改了AB的数据,结果合计还是没变
化。这种情况出现往往和你的一些什么设置有关。
公式不能计算解决步骤3:继续观察,双击单元格,看到公式的
确还在,并且公式是正确的。
公式不能计算解决步骤4:经过刚才的双击公式后,发现能计算
出最新的正确结果了。
继续反复测试发现,修改数据后必须双击一下公式单元格才能计
算。
公式不能计算解决步骤5:以上现象,一般是因为接下来介绍的
设置造成的。以ex ___lxx为例。点工具菜单中的选项。
公式不能计算解决步骤6:在“重新计算”标签中。检查你的设
置。默认应该是“自动重算”这个设置。
公式不能计算解决步骤7:如果改成手动重算,就会出现本例的
故障。那么 ___要有这个设置呢?这不是自找麻烦吗?这个说来话
长,暂且这么理解,存在就有存在的道理。
公式不能计算解决步骤8:有时候ex ___l的文件数据公式较
多,如果都是自动计算的话,反复计算影响工作。那么就需要合理
设置成手动计算,等确定修改好公式数据什么的以后,在改回来。
模板,内容仅供参考
使用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这两种类型。
POI通用导出Excel(.xls,.xlsx)的方法
POI通⽤导出Excel(.xls,.xlsx)的⽅法POI操作EXCEL对象HSSF:操作Excel 97(.xls)格式XSSF:操作Excel 2007 OOXML (.xlsx)格式,操作EXCEL内存占⽤⾼于HSSFSXSSF:从POI3.8 beta3开始⽀持,基于XSSF,低内存占⽤。
使⽤POI的HSSF对象,⽣成Excel 97(.xls)格式,⽣成的EXCEL不经过压缩直接导出。
线上问题:负载服务器转发请求到应⽤服务器阻塞,以及内存溢出。
如果系统存在⼤数据量报表导出,则考虑使⽤POI的SXSSF进⾏EXCEL操作。
HSSF⽣成的Excel 97(.xls)格式本⾝就有每个sheet页不能超过65536条的限制。
XSSF⽣成Excel 2007 OOXML (.xlsx)格式,条数增加了,但是导出过程中,内存占⽤率却⾼于HSSF.SXSSF是⾃3.8-beta3版本后,基于XSSF提供的低内存占⽤的操作EXCEL对象。
其原理是可以设置或者⼿动将内存中的EXCEL⾏写到硬盘中,这样内存中只保存了少量的EXCEL⾏进⾏操作。
EXCEL的压缩率特别⾼,能达到80%,12M的⽂件压缩后才2M左右。
如果未经过压缩、不仅会占⽤⽤户带宽,且会导致负载服务器(apache)和应⽤服务器之间,长时间占⽤连接(⼆进制流转发),导致负载服务器请求阻塞,不能提供服务。
⼀定要注意⽂件流的关闭防⽌前台(页⾯)连续触发导出EXCEL1.通⽤核⼼导出⼯具类 ExcelUtil.javapackage sy.util;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import ng.reflect.Method;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;import org.apache.poi.hpsf.SummaryInformation;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFClientAnchor;import ermodel.HSSFComment;import ermodel.HSSFFont;import ermodel.HSSFPatriarch;import ermodel.HSSFRichTextString;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.ss.formula.functions.T;import ermodel.CellStyle;import ermodel.DateUtil;import ermodel.Font;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.streaming.SXSSFCell;import org.apache.poi.xssf.streaming.SXSSFRow;import org.apache.poi.xssf.streaming.SXSSFSheet;import org.apache.poi.xssf.streaming.SXSSFWorkbook;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;public class ExcelUtil{public static String NO_DEFINE = "no_define";//未定义的字段public static String DEFAULT_DATE_PATTERN="yyyy年MM⽉dd⽇";//默认⽇期格式public static int DEFAULT_COLOUMN_WIDTH = 17;/*** 导出Excel 97(.xls)格式,少量数据* @param title 标题⾏* @param headMap 属性-列名* @param jsonArray 数据集* @param datePattern ⽇期格式,null则⽤默认⽇期格式* @param colWidth 列宽默认⾄少17个字节* @param out 输出流*/public static void exportExcel(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) { if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;// 声明⼀个⼯作薄HSSFWorkbook workbook = new HSSFWorkbook();workbook.createInformationProperties();workbook.getDocumentSummaryInformation().setCompany("*****公司");SummaryInformation si = workbook.getSummaryInformation();si.setAuthor("JACK"); //填加xls⽂件作者信息si.setApplicationName("导出程序"); //填加xls⽂件创建程序信息si.setLastAuthor("最后保存者信息"); //填加xls⽂件最后保存者信息si.setComments("JACK is a programmer!"); //填加xls⽂件作者信息si.setTitle("POI导出Excel"); //填加xls⽂件标题信息si.setSubject("POI导出Excel");//填加⽂件主题信息si.setCreateDateTime(new Date());//表头样式HSSFCellStyle titleStyle = workbook.createCellStyle();titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);HSSFFont titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 20);titleFont.setBoldweight((short) 700);titleStyle.setFont(titleFont);// 列头样式HSSFCellStyle headerStyle = workbook.createCellStyle();headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);HSSFFont headerFont = workbook.createFont();headerFont.setFontHeightInPoints((short) 12);headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerStyle.setFont(headerFont);// 单元格样式HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);HSSFFont cellFont = workbook.createFont();cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);cellStyle.setFont(cellFont);// ⽣成⼀个(带标题)表格HSSFSheet sheet = workbook.createSheet();// 声明⼀个画图的顶级管理器HSSFPatriarch patriarch = sheet.createDrawingPatriarch();// 定义注释的⼤⼩和位置,详见⽂档HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,0, 0, 0, (short) 4, 2, (short) 6, 5));// 设置注释内容comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));// 设置注释作者,当⿏标移动到单元格上是可以在状态栏中看到该内容.comment.setAuthor("JACK");//设置列宽int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//⾄少字节数int[] arrColWidth = new int[headMap.size()];// 产⽣表格标题⾏,以及设置列宽String[] properties = new String[headMap.size()];String[] headers = new String[headMap.size()];int ii = 0;for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {String fieldName = iter.next();properties[ii] = fieldName;headers[ii] = fieldName;int bytes = fieldName.getBytes().length;arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;sheet.setColumnWidth(ii,arrColWidth[ii]*256);ii++;}// 遍历集合数据,产⽣数据⾏int rowIndex = 0;for (Object obj : jsonArray) {if(rowIndex == 65535 || rowIndex == 0){if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第⼆页显⽰HSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0titleRow.createCell(0).setCellValue(title);titleRow.getCell(0).setCellStyle(titleStyle);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));HSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1for(int i=0;i<headers.length;i++){headerRow.createCell(i).setCellValue(headers[i]);headerRow.getCell(i).setCellStyle(headerStyle);}rowIndex = 2;//数据内容从 rowIndex=2开始}JSONObject jo = (JSONObject) JSONObject.toJSON(obj);HSSFRow dataRow = sheet.createRow(rowIndex);for (int i = 0; i < properties.length; i++){HSSFCell newCell = dataRow.createCell(i);Object o = jo.get(properties[i]);String cellValue = "";if(o==null) cellValue = "";else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);else cellValue = o.toString();newCell.setCellValue(cellValue);newCell.setCellStyle(cellStyle);}rowIndex++;}// ⾃动调整宽度/*for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}*/try {workbook.write(out);workbook.close();} catch (IOException e) {e.printStackTrace();}}/*** 导出Excel 2007 OOXML (.xlsx)格式* @param title 标题⾏* @param headMap 属性-列头* @param jsonArray 数据集* @param datePattern ⽇期格式,传null值则默认年⽉⽇* @param colWidth 列宽默认⾄少17个字节* @param out 输出流*/public static void exportExcelX(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) { if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;// 声明⼀个⼯作薄SXSSFWorkbook workbook = new SXSSFWorkbook(1000);//缓存workbook.setCompressTempFiles(true);//表头样式CellStyle titleStyle = workbook.createCellStyle();titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);Font titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 20);titleFont.setBoldweight((short) 700);titleStyle.setFont(titleFont);// 列头样式CellStyle headerStyle = workbook.createCellStyle();headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);Font headerFont = workbook.createFont();headerFont.setFontHeightInPoints((short) 12);headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);headerStyle.setFont(headerFont);// 单元格样式CellStyle cellStyle = workbook.createCellStyle();cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);Font cellFont = workbook.createFont();cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);cellStyle.setFont(cellFont);// ⽣成⼀个(带标题)表格SXSSFSheet sheet = workbook.createSheet();//设置列宽int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//⾄少字节数 int[] arrColWidth = new int[headMap.size()];// 产⽣表格标题⾏,以及设置列宽String[] properties = new String[headMap.size()];String[] headers = new String[headMap.size()];int ii = 0;for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {String fieldName = iter.next();properties[ii] = fieldName;headers[ii] = headMap.get(fieldName);int bytes = fieldName.getBytes().length;arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;sheet.setColumnWidth(ii,arrColWidth[ii]*256);ii++;}// 遍历集合数据,产⽣数据⾏int rowIndex = 0;for (Object obj : jsonArray) {if(rowIndex == 65535 || rowIndex == 0){if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第⼆页显⽰SXSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0titleRow.createCell(0).setCellValue(title);titleRow.getCell(0).setCellStyle(titleStyle);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));SXSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1for(int i=0;i<headers.length;i++){headerRow.createCell(i).setCellValue(headers[i]);headerRow.getCell(i).setCellStyle(headerStyle);}rowIndex = 2;//数据内容从 rowIndex=2开始}JSONObject jo = (JSONObject) JSONObject.toJSON(obj);SXSSFRow dataRow = sheet.createRow(rowIndex);for (int i = 0; i < properties.length; i++){SXSSFCell newCell = dataRow.createCell(i);Object o = jo.get(properties[i]);String cellValue = "";if(o==null) cellValue = "";else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);else if(o instanceof Float || o instanceof Double)cellValue= new BigDecimal(o.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();else cellValue = o.toString();newCell.setCellValue(cellValue);newCell.setCellStyle(cellStyle);}rowIndex++;}// ⾃动调整宽度/*for (int i = 0; i < headers.length; i++) {sheet.autoSizeColumn(i);}*/try {workbook.write(out);workbook.close();workbook.dispose();} catch (IOException e) {e.printStackTrace();}}//Web 导出excelpublic static void downloadExcelFile(String title,Map<String,String> headMap,JSONArray ja,HttpServletResponse response){ try {ByteArrayOutputStream os = new ByteArrayOutputStream();ExcelUtil.exportExcelX(title,headMap,ja,null,0,os);byte[] content = os.toByteArray();InputStream is = new ByteArrayInputStream(content);// 设置response参数,可以打开下载页⾯response.reset();response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename="+ new String((title + ".xlsx").getBytes(), "iso-8859-1")); response.setContentLength(content.length);ServletOutputStream outputStream = response.getOutputStream();BufferedInputStream bis = new BufferedInputStream(is);BufferedOutputStream bos = new BufferedOutputStream(outputStream);byte[] buff = new byte[8192];int bytesRead;while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {bos.write(buff, 0, bytesRead);}bis.close();bos.close();outputStream.flush();outputStream.close();}catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {int count = 100000;JSONArray ja = new JSONArray();for(int i=0;i<100000;i++){Student s = new Student();s.setName("POI"+i);s.setAge(i);s.setBirthday(new Date());s.setHeight(i);s.setWeight(i);s.setSex(i/2==0?false:true);ja.add(s);}Map<String,String> headMap = new LinkedHashMap<String,String>();headMap.put("name","姓名");headMap.put("age","年龄");headMap.put("birthday","⽣⽇");headMap.put("height","⾝⾼");headMap.put("weight","体重");headMap.put("sex","性别");String title = "测试";/*OutputStream outXls = new FileOutputStream("E://a.xls");System.out.println("正在导出xls....");Date d = new Date();ExcelUtil.exportExcel(title,headMap,ja,null,outXls);System.out.println("共"+count+"条数据,执⾏"+(new Date().getTime()-d.getTime())+"ms");outXls.close();*///OutputStream outXlsx = new FileOutputStream("E://b.xlsx");System.out.println("正在导出xlsx....");Date d2 = new Date();ExcelUtil.exportExcelX(title,headMap,ja,null,0,outXlsx);System.out.println("共"+count+"条数据,执⾏"+(new Date().getTime()-d2.getTime())+"ms"); outXlsx.close();}}class Student {private String name;private int age;private Date birthday;private float height;private double weight;private boolean sex;public String getName() {return name;}public void setName(String name) { = name;}public Integer getAge() {return age;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public float getHeight() {return height;}public void setHeight(float height) {this.height = height;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public boolean isSex() {return sex;}public void setSex(boolean sex) {this.sex = sex;}public void setAge(Integer age) {this.age = age;}}2. 控制器Controller 的写法//导出配件列表@RequestMapping(value = "partExport")@ResponseBodypublic void partExportHttpServletResponse response){JSONArray ja = ptmpOrderService.selectStatExport();//获取业务数据集Map<String,String> headMap = ptmpOrderService.getPartStatHeadMap();//获取属性-列头String title = "配件统计表";ExcelUtil.downloadExcelFile(title,headMap,ja,response);}3.前端页⾯的写法(不要⽤异步⽅式请求,如$.post)//可以点击⼀个按钮事件触发下⾯的代码进⾏导出window.open("partExport","_blank");//或者可以提交表单$('#form').attr('action','partExport');$('#form').attr('target','_blank');$('#form').submit();4.POI依赖的jar包(maven pom)<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>5.本地测试将10w条数据导出到本地硬盘中,HSSF⽅式⽤时14s左右,SXSSF⽅式⽤时24s左右,尽管如此,但建议使⽤SXSSF导出.xlsx的excel.之所以使⽤JSONArray作为数据集,⽽没有采⽤java的集合类,是因为JSONObject 在获取数据的时候是采⽤ get(key)的⽅式,正好与属性列对应,这样灵活性⾼,属性列不必与java对象的字段匹配。
Excel表格函数不能用怎么解决
Excel表格函数不能用怎么解决有时候EXCEL中数据做了修改,突然发现公式不能计算最新正确结果了。
你说怪不怪。
那么Excel表格函数不可以用怎样解决呢?今天,店铺就教大家在Excel中公式突然不能计算了的解决方法,欢迎大家来到店铺学习。
Excel中公式突然不能计算的解决方法拿个基础例子说明了,表中前三列加起来,用公式计算得出第四列合计。
目前数据是正确的。
修改了AB的数据,结果合计还是没变化。
这种情况出现往往和你的一些什么设置有关。
继续观察,双击单元格,看到公式的确还在,并且公式是正确的。
经过刚才的双击公式后,发现能计算出最新的正确结果了。
继续反复测试发现,修改数据后必须双击一下公式单元格才能计算。
以上现象,一般是因为接下来介绍的设置造成的。
以excel2003为例。
点工具菜单中的选项。
在“重新计算”标签中。
检查你的电脑设置。
默认应该是“自动重算”这个设置。
如果改成手动重算,就会出现本例的故障。
那么为什么要有这个设置呢?这不是自找麻烦吗?这个说来话长,暂且这么理解,存在就有存在的道理。
有时候excel的文件数据公式较多,如果都是自动计算的话,反复计算影响工作。
那么就需要合理设置成手动计算,等确定修改好公式数据什么的以后,在改回来。
Excel表格使用秘诀一、让不同类型数据用不同颜色显示在工资表中,如果想让大于等于2000元的工资总额以“红色”显示,大于等于1500元的工资总额以“蓝色”显示,低于1000元的工资总额以“棕色”显示,其它以“黑色”显示,我们可以这样设置。
1.打开“工资表”工作簿,选中“工资总额”所在列,执行“格式→条件格式”命令,打开“条件格式”对话框。
单击第二个方框右侧的下拉按钮,选中“大于或等于”选项,在后面的方框中输入数值“2000”。
单击“格式”按钮,打开“单元格格式”对话框,将“字体”的“颜色”设置为“红色”。
2.按“添加”按钮,并仿照上面的操作设置好其它条件(大于等于1500,字体设置为“蓝色”;小于1000,字体设置为“棕色”)。
为什么Excel写的公式却不计算?
2、解决方法1:将单元格改成常规格式,重新双击单元格,进入编辑状态,按回车,再向下复 制单元格,现在计算了。 3、原因分析2:不小心点击了公式菜单中的显示公式按钮。
4、解决方法2:重新再点击一下公式菜单中的:显示公式按钮就可以了。
将单元格改成常规格式重新双击单元格进入编辑公式却不计算?
一起来看看是怎么回事,怎么解决呢? 1、 如 下 图 : 在 F2单 元 格 输 入 公 式 计 算 销 量 , 并 向 下 复 制 , 但 是 公 式 却 不 计 算 ?
原因及解决方法 1、原因分析1:单元格格式是文本,公式不计算。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
POI生成EXCEL
,公式不自动执行的问题
场景:POI读取Excel模板。
当使用POI操作Excel时,发现由POI生成的公式能够在打开Excel是被执行,
而事先手工写入Excel模板文件的公式则不自动被调用,必须手动双击该Cell才能生效。
采取的办法:
1.使用cell.setCellFormula方法重新在制定Cell
里写入公式。
2.使用sheet.setForceFormulaRecalculation(true);方法强制让改Sheet
执行公式。
当然,在方法2能够生效的情况下我们还是推荐使用方法2来解决这个问题。