在工作中需要将mongo中的数据导出到excel中,所以根据需要学习了poi。以下为学习内容的总结:

1.POI是什么?

  • poi是Apache团队开发的专门面对用java处理Excel文档的工具。
  • 官网地址:https://poi.apache.org/
  • 在操作exccel有HSSFWorkbook和XSSFWorkbook两种方式。两种方式的区别在于根据excel的版本不同,一个简单的方式就是后缀为.xls为HSSFWorkbook;后缀为.xlsx为XSSFWorkbook

2.输出Excel操作流程

  • 此部分通过代码解释使用POI将集合导出Excel的流程,在下一节中详细解释。
  1.   /**
  2. * 将集合转化为Excel表格
  3. */
  4. public void getExcel(List<List<String>> list) throws IOException {
  5. //1.标题
  6. String[] title = {"招聘名称", "投递邮箱", "信息来源", "信息城市", "来源网站"};
  7. //2.文件名
  8. String fileName = new String("企业邮箱信息.xls".getBytes(), "utf-8");
  9. //3.sheet名
  10. String sheetName = new String("梧桐果、海投网、我司企业邮箱信息".getBytes(), "utf-8");
  11.  
  12. // 1.创建一个HSSFWorkbook,对应一个Excel文件
  13. HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
  14. // 2.在workbook中添加一个sheet,对应Excel文件中的sheet
  15. HSSFSheet sheet = hssfWorkbook.createSheet(sheetName);
  16. // 3.在sheet中添加表头第0行,也就是标题行
  17. HSSFRow row = sheet.createRow(0);
  18. // 4.创建单元格,并设置单元格格式
  19. HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
  20. cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//样式为中心水平对齐
  21.  
  22. //5.创建列单元格
  23. for (int i = 0; i < title.length; i++) {
  24. HSSFCell cell = row.createCell(i);
  25. cell.setCellValue(title[i]);
  26. cell.setCellStyle(cellStyle);
  27. }//表头
  28.  
  29. for (int y = 0; y < list.size(); y++) {
  30. HSSFRow row1 = sheet.createRow(y + 1);//创建行
  31. List<String> strings = list.get(y);
  32. for (int x = 0; x < title.length; x++) {
  33. HSSFCell cell = row1.createCell(x);
  34. cell.setCellValue(strings.get(x));
  35. cell.setCellStyle(cellStyle);//创建列
  36. }
  37. }
  38.  
  39. File file = new File("C:\\Users\\bxk\\Desktop\\" + fileName);
  40. OutputStream outputStream = new FileOutputStream(file);
  41. hssfWorkbook.write(outputStream);
  42. outputStream.flush();
  43. outputStream.close();
  44. }

3.输出Excel操作步骤详解

3.1创建出所需的文件信息

  1. //1.标题
  2. String[] title = {"招聘名称", "投递邮箱", "信息来源", "信息城市", "来源网站"};
  3. //2.文件名
  4. String fileName = new String("企业邮箱信息.xls".getBytes(), "utf-8");
  5. //3.sheet名
  6. String sheetName = new String("我是一个sheet名称".getBytes(), "utf-8");

3.2 创建WorkBook

  1. HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); //对应一个Excel文件

  demo:如下文就可以生成一个空白的、名为workbook的xlsk文档。注意当文件名为中文的时候可能会出现乱码。使用 new String("中文","utf-8") ,将解决乱码问题。

  1. HSSFWorkbook wb = new XSSFWorkbook(); try (OutputStream fileOut = new FileOutputStream("workbook.xlsx")) { wb.write(fileOut); }

3.3创建Sheet

  1. HSSFSheet sheet = hssfWorkbook.createSheet(sheetName);//对应Excel文件中的sheet 其中sheetName不能为 "" ,不能为 Null

值得注意的是,创建的过程中不会覆盖。每一个sheet都是独立的,就算此sheet并没有使用,也不会消失,而是叠加。

  1. String safeName = WorkbookUtil.createSafeSheetName("");//这样创建的sheetName ""会转化为empty,null会转化为“null”

这个sheet我当时也找了好一会,可能是实在是不熟悉Excel。sheet就表示excel中的某一张表,当然既然是表,就会有表名。所以sheetName的作用就是显示表名。上截图解释具体位置。

3.4创建表头

  1. HSSFRow row = sheet.createRow(0);// 在sheet中添加表头第0行,也就是标题行

3.5创建单元格样式

  1. HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
  2. cellStyle.setAlignment(HorizontalAlignment.CENTER);//样式为中心水平对齐 还有其他样式都在 HorizontalAlignment 中,可以自行查找。
  1.  

3.6创建列单元格

  1. for (int i = 0; i < title.length; i++) {
  2. HSSFCell cell = row.createCell(i);
  3. cell.setCellValue(title[i]);
  4. cell.setCellStyle(cellStyle);
  5. }//表头

 在poi中对于excel的操作,只有行操作:定位到某一行,进行具体操作。所以就需要得到行元素HSSFRow ,在根据 HSSFCell  定位到某行的第某个单元格。

3.7创建数据

  1. for (int y = 0; y < list.size(); y++) {
  2. List<String> strings = list.get(y);
  3. if (strings.get(0).toString().indexOf("海投") != -1 || strings.get(0).toString().indexOf("梧桐果") != -1) {
  4. continue;
  5. }
  6. HSSFRow row1 = sheet.createRow(y + 1);//创建行
  7. for (int x = 0; x < title.length; x++) {
  8. HSSFCell cell = row1.createCell(x);
  9. cell.setCellValue(strings.get(x));
  10. cell.setCellStyle(cellStyle);//创建列
  11. }
  12. }

3.8打印输出

  1. File file = new File("C:\\Users\\bxk\\Desktop\\" + fileName);
  2. OutputStream outputStream = new FileOutputStream(file);
  3. hssfWorkbook.write(outputStream);
  4. outputStream.flush();
  5. outputStream.close();

此处有个小提示,在idea中输出输入流或者HSSFWorkbook 等创建后,没有close的都会标红,看着实在是难受。可以try后在finally中进行close,可以解决标红。

4读取excel文件

为什么又学习了读取excel呢,就是因为我感觉爬虫的数据不够完美,打算重新爬一边,就把数据库删了....。然后那个数据一时半会也爬不下来。

(爬不下来的原因:1.爬的速度太快,ip被封,就算后来设置了得到一个数据暂停一秒也不可以。。。2.在西刺网得到一些服务器的ip和端口号,借助这些服务器去帮我爬取数据。可是这些服务器不稳定 ,有时会出现连接超时等错误,就需要手动重启项目。很麻烦。有一个想法:就是当运行出现超时错误时,重启项目。刚好设计模式中的观察者模式可以解决这个问题)

所以我就换了一个方法。。。重新读取导出的excel数据,将数据重新切割进行保存。

这个事情告诉我,删数据库之前,一定要做好备份。。。

  1. /**
  2. * 读取我司数据库 中的数据 C:\Users\bxk\Desktop\企业邮箱信息(我司数据里).xls
  3. */
  4. public List<List<String>> getExcelDateToAddress() {
  5. ArrayList<List<String>> lists = new ArrayList<>();
  6. Workbook wb = null;
  7. InputStream inp = null;
  8. try {
  9. inp = new FileInputStream("C:\\Users\\bxk\\Desktop\\数据.xls");
  10. wb = new HSSFWorkbook(inp);  //读取excel文件
  11. Sheet sheetAt = wb.getSheetAt(0);  //得到第一个sheet文件,
  12. Iterator<Row> rowIterator = sheetAt.rowIterator();  //得到行数的迭代器
  13. while (rowIterator.hasNext()) {
  14. ArrayList<String> strings = new ArrayList<>();
  15. Row next = rowIterator.next();
  16. Iterator<Cell> cellIterator = next.cellIterator();
  17. while (cellIterator.hasNext()) {  //得到单元格的迭代器
  18. Cell next1 = cellIterator.next();
  19. String stringCellValue = next1.getStringCellValue();
  20. strings.add(stringCellValue);
  21. }
  22. strings.set(3, getCity(strings.get(3)));
  23. lists.add(strings);
  24. }
  25. } catch (FileNotFoundException e) {
  26. e.printStackTrace();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. } finally {
  30. try {
  31. wb.close();
  32. inp.close();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. return lists;
  38. }

这个很简单,就不详细解释了。当poi读取到文件后,就会分析出sheet、行数等消息。但是我找了好半天也没有得到行数的接口。想要读取每行的信息,只能通过迭代器。

打开官网(上面有链接)——API介绍(Component)——快速指南(Quick Guide) 也能看到详细的例子和解释哦。

【POI】java对excel的读写操作的更多相关文章

  1. 使用JXL.jar实现JAVA对EXCEL的读写操作

    简介: jxl.jar是通过java操作excel表格的工具类库 jxl操作excel包括对象Workbook(工作簿),Sheet(工作表) ,Cell(单元格). 一个excel就对应一个Work ...

  2. JAVA实现Excel的读写--jxl

    前段时间因为开发网站的需要,研究了一下java实现excel的读写,一般当我们做管理软件时,都需要打印报表,报表如何制作呢?相信一定难为过大家,本篇就为大家揭开它的神秘面纱,学习完半篇,你一定会对报表 ...

  3. Java 字节流实现文件读写操作(InputStream-OutputStream)

    Java 字节流实现文件读写操作(InputStream-OutputStream) 备注:字节流比字符流底层,但是效率底下. 字符流地址:http://pengyan5945.iteye.com/b ...

  4. 使用Python对Excel进行读写操作

    学习Python的过程中,我们会遇到Excel的读写问题.这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据.下面我们介绍如何实现使用Python对Exc ...

  5. Python—对Excel进行读写操作

    学习Python的过程中,我们会遇到Excel的读写问题.通过搜索得知,我们可以使用xlwt module将数据写入Excel表格,使用xlrd module从Excel读取数据.下面介绍如何实现使用 ...

  6. JAVA实现Excel的读写--poi

    上一篇为大家介绍了通过xls.jar的方式生成Excel的方法,本篇就为大家再介绍一下通过poi方式实现Excel文件的读写操作,内容很简单,代码注释很清晰. 1.生成Excel文件: import ...

  7. Apache POI 实现对 Excel 文件读写

    1. Apache POI 简介 Apache POI是Apache软件基金会的开放源码函式库. 提供API给Java应用程序对Microsoft Office格式档案读和写的功能. 老外起名字总是很 ...

  8. 78、excel的读写操作

    本篇主要是用python来自动生成excel数据文件也就是简单的excel读写操作.python读写excel文件主要是第三方模块库xlrd.xlwt. 本篇导航: 写excel 读excel 一.写 ...

  9. 使用jxl操作之一: 实现对Excel简单读写操作

    项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String u ...

随机推荐

  1. Vue 知识整理—02-起步

    一:Vue 语法格式: vue vm = new Vue({ //选项 }) 二:Vue 实例: <div id="app"> <p>{{message}} ...

  2. VS2013 中 CString类型转换为LPCSTR类型

    HWND hWnd = ::FindWindow(NULL, L"XXXXXXX"); if (hWnd != NULL) { DWORD dwReadBytes; unsigne ...

  3. linux下sort命令详解

    1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [rocrocket@rocrocket progr ...

  4. linux常用命令 命令管道符

    多命令顺序执行 多命令顺序执行 多命令执行符 格式 作用 : 命令1:命令2 多个命令顺序执行,命令之间没有任何逻辑联系 && 命令1&&命令2 逻辑与 当命令1正确执 ...

  5. vue学习02

    圆中圆: father: padding:6px width:56px height:56px border-radius:50% box-sizing:border-box son: width:1 ...

  6. Android向通讯录添加联系人的一般方法

    Android向通讯录添加联系人的一般方法 以一个简单的例子加以说明,记得需要相应的权限: 测试代码,关键的内容就在add函数里面. package zhangphil.demo; import an ...

  7. 微信小程序-解决下拉刷新报错

    关于“enablePullDownRefresh”: “true” 一.使用方式 在 Page 中定义 onPullDownRefresh 处理函数,监听该页面用户下拉刷新事件.需要在 config ...

  8. react系列笔记:第一记-redux

    前言: 目前公司使用dva,对于前不久还是使用原生js的我来说,花了差不多一两周时间,基本掌握如何使用.虽然对于react有一点点基础,但很多地方未深入,很多概念也很模糊,故从本文开始,记录一下系统的 ...

  9. union、union all 、distinct的区别和用途

    1.从用途上讲 它们都具有去重的效果 2.从效率上讲 distinct通常不建议使用,效率较低;union all 和union 而言,union all效率更高;原因是:union 相当于多表查询出 ...

  10. [HAOI2008]移动玩具

    这又是一道神奇的搜索题...只要记录每种状态...然后暴力判断这种状态往后一步的情况... 广搜出最优解即可... 呆码: #include<iostream> #include<c ...