xlsx和xlsm区别:
xlsm中默认启动宏,而xlsx则是虽然带有宏,也不会被excel执行。
写在前头的经验教训:
1,POI-3.15的Sheet.getLastRowNum()是0-based;Row.getLastColNum()结果是1-based。
2,poi中getPhysicalNumberOfRows()和getLastRowNum()区别 :
举例说明:修改xlsx文件后缀为rar,解压之(xlsx是ooxml格式的文件)。找到xl\worksheets\sheet*.xml文件,打开,可以看到这是一个xml文件,这时候,如果我们在其中的sheetData元素中添加一个空的<row></row>
标签。
getPhysicalNumberOfRows()计算的是所有的<row>
标签的总数。
getLastRowNum()计算的是所有<row>
标签中r属性(行号)的最大值。
所以我们在遍历EXCEL的时候,应该使用的遍历行号上限(闭区间)是getLastRowNum().在这其中,可能会遇到Row==null的情况需要跳过。
另一方面,出于业务方向的考虑,我们一般要检查row!=null的时候一行中是否全是“空白”符号,如果全是空白符号的行一般不作为数据行分析。
3,有关格式,千万不要试图将那些线程不安全的对象作为静态常量,之前在使用jxl框架的时候,企图将格式对象作为全局静态常量,最后居然在因为线程不安全居然出现了相当摸不着头脑的bug(第一次导出成功,之后的同一导出请求的返回数据文件很可能会被损坏)。
读:
辅助类:
/**
* @author kingbaron
* @version 1.0
* @date 2016/12/21
* @package demo
*/
public class WorkbookFactory {
/**
* 读取excel输入流
* @param ips
* @return
*/
public static Workbook createWorkBook(InputStream ips){
Workbook workbook=null;
try{
workbook=getWorkBook(ips);
}catch (Exception ex){
throw new AppInternalException(