当前位置:   article > 正文

读取excel到对象_readsheet 撖寡情

readsheet 撖寡情

简单读取excel表格的工具类,网上下载,然后做了部分改动,本工具类只适合读取.xls结尾的excel,.xlsx结尾的excel不支持。readExcelContent方法返回map类型,key表示行号,value表示行内容。为保证单元格与对象属性完全匹配,没有数据的单元格设置为" &",最终的数据用split("&")分割,excel里有10个单元格就会分出10段数据。然后分别赋值给对象。 

需要poi包

  1. /**
  2. * 操作Excel表格的功能类
  3. */
  4. public class ExcelReader {
  5. private POIFSFileSystem fs;
  6. private HSSFWorkbook wb;
  7. private HSSFSheet sheet;
  8. private HSSFRow row;
  9. /**
  10. * 读取Excel表格表头的内容
  11. *
  12. * @param InputStream
  13. * @return String 表头内容的数组
  14. */
  15. public String[] readExcelTitle(InputStream is) {
  16. try {
  17. fs = new POIFSFileSystem(is);
  18. wb = new HSSFWorkbook(fs);
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. sheet = wb.getSheetAt(0);
  23. row = sheet.getRow(0);
  24. // 标题总列数
  25. int colNum = row.getPhysicalNumberOfCells();
  26. System.out.println("colNum:" + colNum);
  27. String[] title = new String[colNum];
  28. for (int i = 0; i < colNum; i++) {
  29. // title[i] = getStringCellValue(row.getCell((short) i));
  30. title[i] = getCellFormatValue(row.getCell((short) i));
  31. }
  32. return title;
  33. }
  34. /**
  35. * 读取Excel数据内容
  36. *
  37. * @param InputStream
  38. * @return Map 包含单元格数据内容的Map对象
  39. */
  40. public Map<Integer, String> readExcelContent(InputStream is) {
  41. Map<Integer, String> content = new HashMap<Integer, String>();
  42. String str = "";
  43. try {
  44. fs = new POIFSFileSystem(is);
  45. wb = new HSSFWorkbook(fs);
  46. } catch (IOException e) {
  47. e.printStackTrace();
  48. }
  49. sheet = wb.getSheetAt(0);
  50. // 得到总行数
  51. int rowNum = sheet.getLastRowNum();
  52. row = sheet.getRow(0);
  53. int colNum = row.getPhysicalNumberOfCells();
  54. // 正文内容应该从第二行开始,第一行为表头的标题
  55. for (int i = 1; i <= rowNum; i++) {
  56. row = sheet.getRow(i);
  57. int j = 0;
  58. while (j < colNum) {
  59. // 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
  60. // 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
  61. // str += getStringCellValue(row.getCell((short) j)).trim() +"-";
  62. // 为保证单元格与对象属性完全匹配,没有数据的单元格设置为" &",最终的数据用split("&")分割,excel里有10个单元格就会分出10段数据。
  63. str += "".equals(getCellFormatValue(row.getCell((short) j))
  64. .trim()) ? " &" : getCellFormatValue(
  65. row.getCell((short) j)).trim()
  66. + "&";
  67. // 没有数据的单元格设置为""
  68. //str += getCellFormatValue(row.getCell((short) j)).trim() + "&";
  69. j++;
  70. }
  71. content.put(i, str);
  72. str = "";
  73. }
  74. return content;
  75. }
  76. /**
  77. * 获取单元格数据内容为字符串类型的数据
  78. *
  79. * @param cell
  80. * Excel单元格
  81. * @return String 单元格数据内容
  82. */
  83. private String getStringCellValue(HSSFCell cell) {
  84. String strCell = "";
  85. switch (cell.getCellType()) {
  86. case HSSFCell.CELL_TYPE_STRING:
  87. strCell = cell.getStringCellValue();
  88. break;
  89. case HSSFCell.CELL_TYPE_NUMERIC:
  90. strCell = String.valueOf(cell.getNumericCellValue());
  91. break;
  92. case HSSFCell.CELL_TYPE_BOOLEAN:
  93. strCell = String.valueOf(cell.getBooleanCellValue());
  94. break;
  95. case HSSFCell.CELL_TYPE_BLANK:
  96. strCell = "";
  97. break;
  98. default:
  99. strCell = "";
  100. break;
  101. }
  102. if (strCell.equals("") || strCell == null) {
  103. return "";
  104. }
  105. if (cell == null) {
  106. return "";
  107. }
  108. return strCell;
  109. }
  110. /**
  111. * 获取单元格数据内容为日期类型的数据
  112. *
  113. * @param cell
  114. * Excel单元格
  115. * @return String 单元格数据内容
  116. */
  117. private String getDateCellValue(HSSFCell cell) {
  118. String result = "";
  119. try {
  120. int cellType = cell.getCellType();
  121. if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
  122. Date date = cell.getDateCellValue();
  123. result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
  124. + "-" + date.getDate();
  125. } else if (cellType == HSSFCell.CELL_TYPE_STRING) {
  126. String date = getStringCellValue(cell);
  127. result = date.replaceAll("[年月]", "-").replace("日", "").trim();
  128. } else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
  129. result = "";
  130. }
  131. } catch (Exception e) {
  132. System.out.println("日期格式不正确!");
  133. e.printStackTrace();
  134. }
  135. return result;
  136. }
  137. /**
  138. * 根据HSSFCell类型设置数据
  139. *
  140. * @param cell
  141. * @return
  142. */
  143. private String getCellFormatValue(HSSFCell cell) {
  144. String cellvalue = "";
  145. if (cell != null) {
  146. // 判断当前Cell的Type
  147. switch (cell.getCellType()) {
  148. // 如果当前Cell的Type为NUMERIC
  149. case HSSFCell.CELL_TYPE_NUMERIC:
  150. case HSSFCell.CELL_TYPE_FORMULA: {
  151. // 判断当前的cell是否为Date
  152. if (HSSFDateUtil.isCellDateFormatted(cell)) {
  153. // 如果是Date类型则,转化为Data格式
  154. // 方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
  155. // cellvalue = cell.getDateCellValue().toLocaleString();
  156. // 方法2:这样子的data格式是不带带时分秒的:2011-10-12
  157. Date date = cell.getDateCellValue();
  158. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  159. cellvalue = sdf.format(date);
  160. }
  161. // 如果是纯数字
  162. else {
  163. // 取得当前Cell的数值
  164. cellvalue = String.valueOf(cell.getNumericCellValue());
  165. }
  166. break;
  167. }
  168. // 如果当前Cell的Type为STRIN
  169. case HSSFCell.CELL_TYPE_STRING:
  170. // 取得当前的Cell字符串
  171. cellvalue = cell.getRichStringCellValue().getString();
  172. break;
  173. // 默认的Cell值
  174. default:
  175. cellvalue = " ";
  176. }
  177. } else {
  178. cellvalue = "";
  179. }
  180. return cellvalue;
  181. }
  182. }


声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号