开发中 ,导入导出execl避免不了数据类型格式的校验,在使用poi要使用抽取表面数据,poi暂时不支持单元格抽取,查询poi源码抽取工具类如下,如使用jxl就不必使用,jxl取出的单元格数据已是抽取后的表面数据

注:poi版本 - 3.10


接口 ExeclExtractor
  1. package com.dadi.oa.util.poi;
  2. import org.apache.poi.ss.usermodel.Cell;
  3. /**
  4. * poi execl文本抽取接口
  5. * @author ao.ouyang
  6. *
  7. */
  8. public interface ExeclExtractor {
  9. /**
  10. * 抽取单元格文本
  11. * @param cell
  12. * @return
  13. */
  14. public String getText(Cell cell);
  15. /**
  16. * 公式结果
  17. * @param formulasNotResults
  18. */
  19. public void setFormulasNotResults(boolean formulasNotResults);
  20. /**
  21. * 是否抽取注释
  22. * @param includeCellComments
  23. */
  24. public void setIncludeCellComments(boolean includeCellComments);
  25. }

03版抽取方法 HSSFExeclExtractor

  1. package com.dadi.oa.util.poi;
  2. import org.apache.poi.POIOLE2TextExtractor;
  3. import org.apache.poi.hssf.usermodel.HSSFCell;
  4. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  5. import org.apache.poi.hssf.usermodel.HSSFComment;
  6. import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
  7. import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  8. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  9. import org.apache.poi.ss.formula.eval.ErrorEval;
  10. import org.apache.poi.ss.usermodel.Cell;
  11. import org.apache.poi.xssf.usermodel.XSSFCell;
  12. /**
  13. * Poi操作工具类 03版<br/>
  14. * 功能1:获取execl单元格显示的文本<br/>
  15. * @author ao.ouyang
  16. *
  17. */
  18. public class HSSFExeclExtractor extends POIOLE2TextExtractor implements ExeclExtractor {
  19. private HSSFDataFormatter _formatter;
  20. private boolean _shouldEvaluateFormulas = true;
  21. private boolean _includeCellComments = false;
  22. public HSSFExeclExtractor(HSSFWorkbook wb) {
  23. super(wb);
  24. _formatter = new HSSFDataFormatter();
  25. }
  26. public void setFormulasNotResults(boolean formulasNotResults) {
  27. _shouldEvaluateFormulas = !formulasNotResults;
  28. }
  29. @Override
  30. public void setIncludeCellComments(boolean includeCellComments) {
  31. _includeCellComments = includeCellComments;
  32. }
  33. /**
  34. * 获取单元格格式内容
  35. * @param cell
  36. * @return
  37. */
  38. @Override
  39. public String getText(Cell cell) {
  40. HSSFCell hssfCell = (HSSFCell) cell;
  41. StringBuffer text = new StringBuffer();
  42. if(hssfCell != null) {
  43. switch(hssfCell.getCellType()) {
  44. case HSSFCell.CELL_TYPE_STRING:
  45. text.append(hssfCell.getRichStringCellValue().getString());
  46. break;
  47. case HSSFCell.CELL_TYPE_NUMERIC:
  48. text.append(
  49. _formatter.formatCellValue(hssfCell)
  50. );
  51. break;
  52. case HSSFCell.CELL_TYPE_BOOLEAN:
  53. text.append(hssfCell.getBooleanCellValue());
  54. break;
  55. case HSSFCell.CELL_TYPE_ERROR:
  56. text.append(ErrorEval.getText(hssfCell.getErrorCellValue()));
  57. break;
  58. case HSSFCell.CELL_TYPE_FORMULA:
  59. if(!_shouldEvaluateFormulas) {
  60. text.append(hssfCell.getCellFormula());
  61. } else {
  62. switch(cell.getCachedFormulaResultType()) {
  63. case HSSFCell.CELL_TYPE_STRING:
  64. HSSFRichTextString str = hssfCell.getRichStringCellValue();
  65. if(str != null && str.length() > 0) {
  66. text.append(str.toString());
  67. }
  68. break;
  69. case HSSFCell.CELL_TYPE_NUMERIC:
  70. HSSFCellStyle style = hssfCell.getCellStyle();
  71. if(style == null) {
  72. text.append( cell.getNumericCellValue() );
  73. } else {
  74. text.append(
  75. _formatter.formatRawCellContents(
  76. cell.getNumericCellValue(),
  77. style.getDataFormat(),
  78. style.getDataFormatString()
  79. )
  80. );
  81. }
  82. break;
  83. case HSSFCell.CELL_TYPE_BOOLEAN:
  84. text.append(cell.getBooleanCellValue());
  85. break;
  86. case HSSFCell.CELL_TYPE_ERROR:
  87. text.append(ErrorEval.getText(cell.getErrorCellValue()));
  88. break;
  89. }
  90. }
  91. break;
  92. }
  93. // Output the comment, if requested and exists
  94. HSSFComment comment = hssfCell.getCellComment();
  95. if(_includeCellComments && comment != null) {
  96. // Replace any newlines with spaces, otherwise it
  97. // breaks the output
  98. String commentText = comment.getString().getString().replace('\n', ' ');
  99. text.append(" Comment by "+comment.getAuthor()+": "+commentText);
  100. }
  101. }
  102. return text.toString();
  103. }
  104. @Override
  105. public String getText() {
  106. // TODO Auto-generated method stub
  107. return null;
  108. }
  109. }


07 版抽取方法 XSSFExeclExtractor

  1. package com.dadi.oa.util.poi;
  2. import java.io.IOException;
  3. import java.util.Iterator;
  4. import java.util.Locale;
  5. import org.apache.poi.POIXMLTextExtractor;
  6. import org.apache.poi.ss.usermodel.Cell;
  7. import org.apache.poi.ss.usermodel.CellStyle;
  8. import org.apache.poi.ss.usermodel.Comment;
  9. import org.apache.poi.ss.usermodel.DataFormatter;
  10. import org.apache.poi.xssf.usermodel.XSSFCell;
  11. import org.apache.poi.xssf.usermodel.XSSFSheet;
  12. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  13. /**
  14. * Poi操作工具类 07版<br/>
  15. * 功能1:获取execl单元格显示的文本<br/>
  16. * @author ao.ouyang
  17. *
  18. */
  19. public class XSSFExeclExtractor extends POIXMLTextExtractor implements ExeclExtractor {
  20. private Locale locale;
  21. private boolean formulasNotResults = false;
  22. private boolean includeCellComments = false;
  23. public XSSFExeclExtractor(XSSFWorkbook workbook) {
  24. super(workbook);
  25. }
  26. /**
  27. * 获取单元格格式内容
  28. * @param cell
  29. * @return
  30. */
  31. public String getText(Cell cell) {
  32. XSSFCell xssfCell = (XSSFCell) cell;
  33. DataFormatter formatter;
  34. if(locale == null) {
  35. formatter = new DataFormatter();
  36. } else {
  37. formatter = new DataFormatter(locale);
  38. }
  39. StringBuffer text = new StringBuffer();
  40. // Is it a formula one?
  41. if(xssfCell!=null){
  42. if(xssfCell.getCellType() == Cell.CELL_TYPE_FORMULA) {
  43. if (formulasNotResults) {
  44. text.append(xssfCell.getCellFormula());
  45. } else {
  46. if (xssfCell.getCachedFormulaResultType() == Cell.CELL_TYPE_STRING) {
  47. handleStringCell(text, xssfCell);
  48. } else {
  49. handleNonStringCell(text, xssfCell, formatter);
  50. }
  51. }
  52. } else if(xssfCell.getCellType() == Cell.CELL_TYPE_STRING) {
  53. handleStringCell(text, xssfCell);
  54. } else {
  55. handleNonStringCell(text, xssfCell, formatter);
  56. }
  57. // Output the comment, if requested and exists
  58. Comment comment = xssfCell.getCellComment();
  59. if(includeCellComments && comment != null) {
  60. // Replace any newlines with spaces, otherwise it
  61. // breaks the output
  62. String commentText = comment.getString().getString().replace('\n', ' ');
  63. text.append(" Comment by ").append(comment.getAuthor()).append(": ").append(commentText);
  64. }
  65. }
  66. return text.toString();
  67. }
  68. private void handleStringCell(StringBuffer text, Cell cell) {
  69. text.append(cell.getRichStringCellValue().getString());
  70. }
  71. private void handleNonStringCell(StringBuffer text, Cell cell, DataFormatter formatter) {
  72. int type = cell.getCellType();
  73. if (type == Cell.CELL_TYPE_FORMULA) {
  74. type = cell.getCachedFormulaResultType();
  75. }
  76. if (type == Cell.CELL_TYPE_NUMERIC) {
  77. CellStyle cs = cell.getCellStyle();
  78. if (cs.getDataFormatString() != null) {
  79. text.append(formatter.formatRawCellContents(
  80. cell.getNumericCellValue(), cs.getDataFormat(), cs.getDataFormatString()
  81. ));
  82. return;
  83. }
  84. }
  85. }
  86. @Override
  87. public void setFormulasNotResults(boolean formulasNotResults) {
  88. this.formulasNotResults = formulasNotResults;
  89. }
  90. @Override
  91. public String getText() {
  92. // TODO Auto-generated method stub
  93. return null;
  94. }
  95. @Override
  96. public void setIncludeCellComments(boolean formulasNotResults) {
  97. this.includeCellComments = includeCellComments;
  98. }
  99. }


poi 抽取execl表面数据源代码工具的更多相关文章

  1. [Hadoop 周边] Hadoop和大数据:60款顶级大数据开源工具(2015-10-27)【转】

    说到处理大数据的工具,普通的开源解决方案(尤其是Apache Hadoop)堪称中流砥柱.弗雷斯特调研公司的分析师Mike Gualtieri最近预测,在接下来几年,“100%的大公司”会采用Hado ...

  2. Hadoop和大数据:60款顶级大数据开源工具

    一.Hadoop相关工具 1. Hadoop Apache的Hadoop项目已几乎与大数据划上了等号.它不断壮大起来,已成为一个完整的生态系统,众多开源工具面向高度扩展的分布式计算. 支持的操作系统: ...

  3. 【转载】Hadoop和大数据:60款顶级大数据开源工具

    一.Hadoop相关工具 1. Hadoop Apache的Hadoop项目已几乎与大数据划上了等号.它不断壮大起来,已成为一个完整的生态系统,众多开源工具面向高度扩展的分布式计算. 支持的操作系统: ...

  4. Linux 上的数据可视化工具

    Linux 上的数据可视化工具 5 种开放源码图形化工具简介 Linux® 上用来实现数据的图形可视化的应用程序有很多,从简单的 2-D 绘图到 3-D 制图,再到科学图形编程和图形模拟.幸运的是,这 ...

  5. 数据集成工具Kettle、Sqoop、DataX的比较

    数据集成工具很多,下面是几个使用比较多的开源工具. 1.阿里开源软件:DataX         DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).H ...

  6. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  7. Java POI 实现Excel相同数据同一颜色,不同数据颜色交替显示

    目录 1.效果图 2.具体代码实现 excel 读取工具类 excel写入和测试类 1.效果图 2.具体代码实现 excel 读取工具类 package utils; import java.io.F ...

  8. 一篇文章看懂TPCx-BB(大数据基准测试工具)源码

    TPCx-BB是大数据基准测试工具,它通过模拟零售商的30个应用场景,执行30个查询来衡量基于Hadoop的大数据系统的包括硬件和软件的性能.其中一些场景还用到了机器学习算法(聚类.线性回归等).为了 ...

  9. java的poi技术读取Excel数据到MySQL

    这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...

随机推荐

  1. 前端开发不容错过的jQuery图片滑块插件(转)

    作为前端开发者,我们会碰到很到各种各样的jQuery插件.今天要分享的几款jQuery图片滑块插件,也就是jQuery焦点图插件,基本上会在每个网站都有应用,可以下载看看,也许你可以用到. 1.jQu ...

  2. 【redis】常用命令

    三.常用命令    1)连接操作命令    quit:关闭连接(connection)    auth:简单密码认证    help cmd: 查看cmd帮助,例如:help quit         ...

  3. coding云进行git push报:permission denied

    1.原因可能是 登录其他的git 项目,本地缓存了其他用户的 用户名和密码 认证信息,导致一直权限不通过 解决: git remote add origin http://yourname:passw ...

  4. 转载:substr() mb_substr() mb_subcut区别与联系

    substr() $rest = substr("abcdef", 1); //bcdef $rest = substr("abcdef", 1,5); //b ...

  5. python接口自动化(二十七)--html 测试报告——上(详解)

    简介 上一篇我们批量执行完用例后,生成的测试报告是文本形式的,不够直观,而且报告一般都是发给leader的,所以最好是直观一目了然,为了更好的展示测试报告,最好是生成 HTML 格式的.unittes ...

  6. Android获取屏幕大小和设置无标题栏

    android获取屏幕大小非常常用,例如写个程序,如果要做成通用性很强的程序,适用屏幕很强,一般布局的时候都是根据屏幕的长宽来定义的,所以我把这个总结一下,方便日后忘记的时候查阅.还有就是有时候写程序 ...

  7. android 布局权重问题(最近布局经常坑爹)

    android 布局 权重 With layout_weight you can specify a size ratio between multiple views. E.g. you have ...

  8. linux系统调用sysconf

    1.前言 当前计算机都是多核的,linux2.6提供了进程绑定cpu功能,将进程指定到某个core上执行,方便管理进程.linux提供了sysconf系统调用可以获取系统的cpu个数和可用的cpu个数 ...

  9. Shell习题100例

    每日一文件 https://github.com/aminglinux/shell100/blob/master/ 要求:安照这样的日期格式(xxxx-xx-xx)每日生成一个文件,如生成的文件为20 ...

  10. unity 主循环

    在unity官方文档中看到这个图,感觉很有用,各事件的先后时机看得较清楚. 连接:http://docs.unity3d.com/Manual/ExecutionOrder.html