在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,本文将介绍Excel读写的常用方法,希望对大家学习Java读写Excel会有帮助。

在开始进行Java读写Excel前,我们需要先下一个jxl的jar包,这个jar包中提供了相关读写Excel的方法,在百度里所搜一下jxl.jar下载就会出现很多下载地址了,这里不再累述。随后我们将jxl.jar放到classpath下或者在工程的buildpath中添加jxl.jar后,便可以开始Java读写Excel的神秘之旅了。

1、Java读取Excel数据

首先,创建一个xls文件(如:jxltest.xls),然后在文件中添加一些数据,Excel文件创建完成后,我们便可以开始写代码读取了:

代码如下:

[java] view plaincopy
  1. package jxl.zhanhj;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import jxl.Sheet;
  8. import jxl.Workbook;
  9. import jxl.read.biff.BiffException;
  10. public class GetExcelInfo {
  11. public static void main(String[] args) {
  12. GetExcelInfo obj = new GetExcelInfo();
  13. // 此处为我创建Excel路径:E:/zhanhj/studysrc/jxl下
  14. File file = new File("E:/zhanhj/studysrc/jxl/getExcleinfo.xls");
  15. obj.readExcel(file);
  16. }
  17. // 去读Excel的方法readExcel,该方法的入口参数为一个File对象
  18. public void readExcel(File file) {
  19. try {
  20. // 创建输入流,读取Excel
  21. InputStream is = new FileInputStream(file.getAbsolutePath());
  22. // jxl提供的Workbook类
  23. Workbook wb = Workbook.getWorkbook(is);
  24. // Excel的页签数量
  25. int sheet_size = wb.getNumberOfSheets();
  26. for (int index = 0; index < sheet_size; index++) {
  27. // 每个页签创建一个Sheet对象
  28. Sheet sheet = wb.getSheet(index);
  29. // sheet.getRows()返回该页的总行数
  30. for (int i = 0; i < sheet.getRows(); i++) {
  31. // sheet.getColumns()返回该页的总列数
  32. for (int j = 0; j < sheet.getColumns(); j++) {
  33. String cellinfo = sheet.getCell(j, i).getContents();
  34. System.out.println(cellinfo);
  35. }
  36. }
  37. }
  38. } catch (FileNotFoundException e) {
  39. e.printStackTrace();
  40. } catch (BiffException e) {
  41. e.printStackTrace();
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }

上面这个例子是一个很简单读取Excel并将各单元格的数据打印到控制台上,更多Excel操作方法,请参加jxl API。

下面我们再对上面的例子进行一个小小的扩展:

1、读取一个目录下的所有Excel文件

2、读取的每个Excel文件的数据写入到不同的txt中

代码如下:

[java] view plaincopy
  1. package jxl.zhanhj;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.PrintWriter;
  9. import jxl.Sheet;
  10. import jxl.Workbook;
  11. import jxl.read.biff.BiffException;
  12. public class GetExcelInfo {
  13. public static void main(String[] args) {
  14. GetExcelInfo obj = new GetExcelInfo();
  15. // 此处路径指定到目录而不是单个文件
  16. File file = new File("E:/zhanhj/studysrc/jxl");
  17. if (file.isDirectory()) {
  18. File[] files = file.listFiles();
  19. for (File f : files)
  20. // 如果还存在子目录则继续读取子目录下的Excel文件
  21. if (f.isDirectory()) {
  22. File[] subfiles = f.listFiles();
  23. for (File fi : subfiles) {
  24. // 对文件进行过滤,只读取Excel文件,非Excel文件不读取,否则会出错
  25. if (fi.getName().indexOf(".xls") > 0) {
  26. obj.readExcelWrite2TXT(fi);
  27. }
  28. }
  29. } else {
  30. // 对文件进行过滤,只读取Excel文件,非Excel文件不读取,否则会出错
  31. if (f.getName().indexOf(".xls") > 0) {
  32. obj.readExcelWrite2TXT(f);
  33. }
  34. }
  35. }
  36. }
  37. // 去读Excel的方法readExcel,该方法的入口参数为一个File对象
  38. public void readExcelWrite2TXT(File file) {
  39. // 创建文件输出流
  40. FileWriter fw = null;
  41. PrintWriter out = null;
  42. try {
  43. // 指定生成txt的文件路径
  44. String fileName = file.getName().replace(".xls", "");
  45. fw = new FileWriter(file.getParent() + "/" + fileName + ".txt");
  46. out = new PrintWriter(fw);
  47. // 创建输入流,读取Excel
  48. InputStream is = new FileInputStream(file.getAbsolutePath());
  49. // jxl提供的Workbook类
  50. Workbook wb = Workbook.getWorkbook(is);
  51. // Excel的页签数量
  52. int sheet_size = wb.getNumberOfSheets();
  53. for (int index = 0; index < sheet_size; index++) {
  54. // 每个页签创建一个Sheet对象
  55. Sheet sheet = wb.getSheet(index);
  56. // sheet.getRows()返回该页的总行数
  57. for (int i = 0; i < sheet.getRows(); i++) {
  58. // sheet.getColumns()返回该页的总列数
  59. for (int j = 0; j < sheet.getColumns(); j++) {
  60. String cellinfo = sheet.getCell(j, i).getContents();
  61. // 将从Excel中读取的数据写入到txt中
  62. out.println(cellinfo);
  63. }
  64. }
  65. }
  66. } catch (FileNotFoundException e) {
  67. e.printStackTrace();
  68. } catch (BiffException e) {
  69. e.printStackTrace();
  70. } catch (IOException e) {
  71. e.printStackTrace();
  72. } finally {
  73. try {
  74. // 记得关闭流
  75. out.close();
  76. fw.close();
  77. // 由于此处用到了缓冲流,如果数据量过大,不进行flush操作,某些数据将依旧
  78. // 存在于内从中而不会写入文件,此问题一定要注意
  79. out.flush();
  80. } catch (IOException e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. }
  85. }

下面我们来一起对Java读取Excel流程做一个总结:

1、打开工作文件Workbook,在此之前先用java的io流创建或者读取文件

2、打开工作表Sheet
      3、读行,然后读列(行和列是从0开始的)
      4、进行数据进行操作

接着上一节的内容,本节主要讲述如何通过Java程序向Excel文件中写数据,包括:1、数据类型的控制;2、单元格及数据的格式化。

要快速上手,我们还是通过阅读代码来学习,这样可以帮助大家建立一个更直观的概念和认识。

1、写入Excel及数据类型控制

程序描述:通过Java程序新建一个名为test.xls的文件,并在Excel的第一行第一列写一个字符串,在第一行第二列写一个数字,在第一行第三列写一个日期。

[java] view plaincopy
  1. package jxl.zhanhj;
  2. import java.io.File;
  3. import java.util.Date;
  4. import jxl.Workbook;
  5. import jxl.write.Label;
  6. import jxl.write.WritableSheet;
  7. import jxl.write.WritableWorkbook;
  8. import jxl.write.Number;
  9. import jxl.write.DateTime;
  10. public class CreateExcel {
  11. public static void main(String args[]) {
  12. try {
  13. // 打开文件
  14. WritableWorkbook book = Workbook.createWorkbook(new File(
  15. "test.xls"));
  16. // 生成名为“sheet1”的工作表,参数0表示这是第一页
  17. WritableSheet sheet = book.createSheet("sheet1", 0);
  18. // 在Label对象的构造子中指名单元格位置是第一列第一行(0,0),单元格内容为string
  19. Label label = new Label(0, 0, "string");
  20. // 将定义好的单元格添加到工作表中
  21. sheet.addCell(label);
  22. // 生成一个保存数字的单元格,单元格位置是第二列,第一行,单元格的内容为1234.5
  23. Number number = new Number(1, 0, 1234.5);
  24. sheet.addCell(number);
  25. // 生成一个保存日期的单元格,单元格位置是第三列,第一行,单元格的内容为当前日期
  26. DateTime dtime = new DateTime(2, 0, new Date());
  27. sheet.addCell(dtime);
  28. // 写入数据并关闭文件
  29. book.write();
  30. book.close();
  31. } catch (Exception e) {
  32. System.out.println(e);
  33. }
  34. }
  35. }

几个重要对象解析:

1、WritableWorkbook:用于创建打开Excel文件

2、WritableSheet:用于创建Excel中的页签

3、Label:将单元格指定为文本型,并写入字符串

4、Number:将单元格指定为数字型,并可写入数字

5、DateTime:将单元格指定为日期型,并可写入日期

掌握这几个类及其方法后,我们便可以方便的向Excel进行写入操作了,更多对象请参见jxl api。

2、写入时单元格及数据的格式化

程序描述:在数据写入到单元格后,对数据进行格式化,包括字体大小、颜色等

[java] view plaincopy
  1. package jxl.zhanhj;
  2. import java.io.File;
  3. import java.util.Date;
  4. import jxl.CellType;
  5. import jxl.Workbook;
  6. import jxl.format.Border;
  7. import jxl.format.BorderLineStyle;
  8. import jxl.format.Colour;
  9. import jxl.format.VerticalAlignment;
  10. import jxl.format.Alignment;
  11. import jxl.write.DateFormat;
  12. import jxl.write.Label;
  13. import jxl.write.NumberFormat;
  14. import jxl.write.WritableCellFormat;
  15. import jxl.write.WritableFont;
  16. import jxl.write.WritableSheet;
  17. import jxl.write.WritableWorkbook;
  18. import jxl.write.Number;
  19. import jxl.write.DateTime;
  20. import jxl.write.WriteException;
  21. public class CreateExcel {
  22. public static void main(String args[]) {
  23. try {
  24. // 打开文件
  25. WritableWorkbook book = Workbook
  26. .createWorkbook(new File("test.xls"));
  27. // 生成名为“sheet1”的工作表,参数0表示这是第一页
  28. WritableSheet sheet = book.createSheet("sheet1", 0);
  29. // 在Label对象的构造子中指名单元格位置是第一列第一行(0,0),单元格内容为string
  30. Label label = new Label(0, 0, "string",
  31. getDataCellFormat(CellType.LABEL));
  32. // 将定义好的单元格添加到工作表中
  33. sheet.addCell(label);
  34. // 生成一个保存数字的单元格,单元格位置是第二列,第一行,单元格的内容为1234.5
  35. Number number = new Number(1, 0, 1234.5,
  36. getDataCellFormat(CellType.NUMBER));
  37. sheet.addCell(number);
  38. // 生成一个保存日期的单元格,单元格位置是第三列,第一行,单元格的内容为当前日期
  39. DateTime dtime = new DateTime(2, 0, new Date(),
  40. getDataCellFormat(CellType.DATE));
  41. sheet.addCell(dtime);
  42. // 写入数据并关闭文件
  43. book.write();
  44. book.close();
  45. } catch (Exception e) {
  46. System.out.println(e);
  47. }
  48. }
  49. public static WritableCellFormat getDataCellFormat(CellType type) {
  50. WritableCellFormat wcf = null;
  51. try {
  52. // 字体样式
  53. if (type == CellType.NUMBER || type == CellType.NUMBER_FORMULA) {// 数字
  54. NumberFormat nf = new NumberFormat("#.00");
  55. wcf = new WritableCellFormat(nf);
  56. } else if (type == CellType.DATE) {// 日期
  57. DateFormat df = new DateFormat("yyyy-MM-dd hh:mm:ss");
  58. wcf = new WritableCellFormat(df);
  59. } else {
  60. WritableFont wf = new WritableFont(WritableFont.TIMES, 10,
  61. WritableFont.NO_BOLD, false);
  62. // 字体颜色
  63. wf.setColour(Colour.RED);
  64. wcf = new WritableCellFormat(wf);
  65. }
  66. // 对齐方式
  67. wcf.setAlignment(Alignment.CENTRE);
  68. wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
  69. // 设置上边框
  70. wcf.setBorder(Border.TOP, BorderLineStyle.THIN);
  71. // 设置下边框
  72. wcf.setBorder(Border.BOTTOM, BorderLineStyle.THIN);
  73. // 设置左边框
  74. wcf.setBorder(Border.LEFT, BorderLineStyle.THIN);
  75. // 设置右边框
  76. wcf.setBorder(Border.RIGHT, BorderLineStyle.THIN);
  77. // 设置背景色
  78. wcf.setBackground(Colour.YELLOW);
  79. // 自动换行
  80. wcf.setWrap(true);
  81. } catch (WriteException e) {
  82. e.printStackTrace();
  83. }
  84. return wcf;
  85. }
  86. }

效果:

几个重要对象解析:

1、WritableCellFormat:用于格式化单元格

2、WritableFont:用于格式化字体

更多请参加jxl api。

到这里本节的讲解就结束了,下面我们可以总结出Excel的写入流程:

1、用WritableWorkbook创建Excel文件

2、用WritableSheet创建页签

3、用Label、Number、DateTime等创建单元格内容

4、在创建单元格内容时,我们可以给写一个格式化方法,对单元格内容进行格式化

5、格式化主要包括2类:单元格格式化(WritableCellFormat)、值的格式化(WritableFont)

继前两节的Java读取、写入Excel后,本期将推出Java修改Excel中数据以及格式的方法和技巧,如果大家学习了前面的读、写Excel,相信学习本节内容将是不费吹灰之力啊,不过要灵活的运用还需多加努力呀。

好了,为了展示Java修改Excel的魅力,我们先来设计一个业务场景,这个场景是根据最近做过的一件事设计出来的:

在一张Excel中,有一批学生信息数据如下图:

图1   Excel中的示例数据

在创建Excel时,将Excel中的所在省,所在市做成了下拉菜单以供选择,设置如下:

             

图2    所在省一览                               图3     所在市一览

从图1我们会发现一个问题,王五的填写所在省为:四川省,而所在市为:石家庄,大家都石家庄是河北的省会,所以王五的这种情况属于Excel中的错误数据,那么下面我们来做一件事:将Excel中所有出现省市关系弄错了的,在Excel中进行标注出来!!

代码如下:

[java] view plaincopy
  1. package jxl.zhanhj;
  2. import java.io.*;
  3. import java.util.HashMap;
  4. import jxl.*;
  5. import jxl.format.Alignment;
  6. import jxl.format.Border;
  7. import jxl.format.BorderLineStyle;
  8. import jxl.format.Colour;
  9. import jxl.format.VerticalAlignment;
  10. import jxl.write.Label;
  11. import jxl.write.WritableCellFormat;
  12. import jxl.write.WritableFont;
  13. import jxl.write.WritableSheet;
  14. import jxl.write.WritableWorkbook;
  15. import jxl.write.WriteException;
  16. public class UpdateExcel {
  17. public static void main(String args[]) {
  18. WritableWorkbook book = null;
  19. HashMap<String, String> map = new HashMap<String, String>();
  20. map = getPCKV();
  21. try {
  22. // Excel获得文件
  23. Workbook wb = Workbook.getWorkbook(new File("update_test.xls"));
  24. // 打开一个文件的副本,并且指定数据写回到原文件
  25. book = Workbook.createWorkbook(new File("update_test.xls"), wb);
  26. Sheet sheet = book.getSheet(0);
  27. WritableSheet wsheet = book.getSheet(0);
  28. int colunms = sheet.getColumns();
  29. // 不读表头
  30. for (int i = 1; i < sheet.getRows(); i++) {
  31. StringBuffer pcin = new StringBuffer();
  32. // 将省市组合起来与HashMap进行匹配
  33. String province = sheet.getCell(4, i).getContents().trim();
  34. String city = sheet.getCell(5, i).getContents().trim();
  35. pcin = pcin.append(province).append("-").append(city);
  36. // 如果不匹配,则在该行的最后加入标注信息
  37. if (!map.containsValue(pcin.toString())) {
  38. Label label = new Label(colunms, i, "省市选择出错",
  39. getDataCellFormat());
  40. wsheet.addCell(label);
  41. }
  42. }
  43. book.write();
  44. } catch (Exception e) {
  45. System.out.println(e);
  46. } finally {
  47. try {
  48. book.close();
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. }
  54. // 设置标注的格式为黄底红字
  55. public static WritableCellFormat getDataCellFormat() {
  56. WritableCellFormat wcf = null;
  57. try {
  58. WritableFont wf = new WritableFont(WritableFont.TIMES, 10,
  59. WritableFont.BOLD, false);
  60. // 字体颜色
  61. wf.setColour(Colour.RED);
  62. wcf = new WritableCellFormat(wf);
  63. // 对齐方式
  64. wcf.setAlignment(Alignment.CENTRE);
  65. wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
  66. // 设置上边框
  67. wcf.setBorder(Border.TOP, BorderLineStyle.THIN);
  68. // 设置下边框
  69. wcf.setBorder(Border.BOTTOM, BorderLineStyle.THIN);
  70. // 设置左边框
  71. wcf.setBorder(Border.LEFT, BorderLineStyle.THIN);
  72. // 设置右边框
  73. wcf.setBorder(Border.RIGHT, BorderLineStyle.THIN);
  74. // 设置背景色
  75. wcf.setBackground(Colour.YELLOW);
  76. // 自动换行
  77. wcf.setWrap(true);
  78. } catch (WriteException e) {
  79. e.printStackTrace();
  80. }
  81. return wcf;
  82. }
  83. // 省市对应关系Map
  84. public static HashMap<String, String> getPCKV() {
  85. HashMap<String, String> map = new HashMap<String, String>();
  86. map.put("01", "河北省-石家庄");
  87. map.put("02", "河北省-秦皇岛");
  88. map.put("03", "河北省-唐山");
  89. map.put("04", "四川省-成都");
  90. map.put("05", "四川省-绵阳");
  91. map.put("06", "四川省-达州");
  92. map.put("07", "广西省-桂林");
  93. map.put("08", "广西省-南宁");
  94. map.put("09", "广西省-柳州");
  95. return map;
  96. }
  97. }

代码执行结果如图所示:

图4      执行结果

到这里,Java修改Excel单元格的数据及格式便告一段落了,本节给出了一个较为简单的场景进行了讲述,目的在于引导大家学习Java修改Excel的常用流程和方法,若读者能将Java操作Excel学得更深,往往可以发挥更大的作用。比如程序中利用HashMap来存储对应关系,如果要将全国的省市纳入进来,利用HashMap不是很好的做好,我们可以改成通过利用数据库来达到同样的效果,这里的改进留给读者。

读到这里,可能有部分读者会产生疑问,这种操作,直接在Excel中,我们不是也可以操作吗?为什么通过Java来修改,是不是多此一举了?其实不然,如果读者将Java读写文件结合起来,以及在将此程序稍微扩展一下,对每个Excel的所有页签进行遍历,那么Java程序处理的数据里和复杂度,远远不是单纯的Excel能企及的。举个简单的场景(仅仅将上述场景进行扩展):

如果一个学院要统计该学院所有学生的信息【格式和图1一样】,每个级发一个Excel,每个级不同专业的学生放在不同的页签中(sheet),如Excel样式下图所示:

图5      09级学生信息统计表

图6      10级学生信息统计表

最终,学院要根据收集上来的学生信息导入到数据库中,如果你是那个负责导入数据的人,你便通过Java读写Excel功能将所有的数据转化成SQL语句,同时可以判断出哪些同学信息填写错误,是不是这种应用变得更有意义了?

Java读取、写入、处理Excel文件中的数据相关推荐

  1. Python读取excel文件中的数据,绘制折线图、散点图

    https://www.cnblogs.com/liulinghua90/p/9935642.html https://blog.csdn.net/qq_32458499/article/detail ...

  2. 使用Excel4J获取Excel文件中的数据

    特别提示:使用该组件(3.0.0版本)进行读取数据内容,会遇到当单元格为空(null)的时候会自动跳过该单元格(空字符串是可以正常读取到的),去取与其同行的下一个单元格的数据内容,因此该组件适合读取数 ...

  3. matlab引用数据,excel引用数据-如何用matlab处理excel文件中的数据?

    如何利用matlab根据excel表格里面的数据画图 将待导入的矩阵结数据Excel中,录入时注意行列原矩阵一一对应 录入完以后数据,为了后续步骤使用方便,命名时我们最好把它命名为我们接下来在MATL ...

  4. 在matlab中导入excel,Matlab导入Excel文件中的数据的详细教程分享

    操作Matlab时还不会导入Excel文件中的数据?本文就介绍了Matlab导入Excel文件中的数据的操作内容,想要学习的朋友可以看一看下文哦,相信对大家会有所帮助的. 直接点击鼠标操作导入数据 打 ...

  5. matlab如何读取excel文件中的数据?_Python自动化之从Excel文件读取数据

    前言: 在Python语言,常用的excel读写库有xrld和openpyxl两个,当然pandas库也可以从excel文件中读取数据,但这里不建议使用.有个问题就是,xrld只能用于读取数据而不能用 ...

  6. PHP将excel文件中的数据批量导入到数据库中

    2019独角兽企业重金招聘Python工程师标准>>> 这几天在做项目时,遇到了需要批量导入数据的情况,用户将excel表格提交后,需要我们后台这边将excel表格信息中的内容全部插 ...

  7. php excel批量导入,PHP将excel文件中的数据批量导入到数据库中

    这几天在做项目时,遇到了需要批量导入数据的情况,用户将excel表格提交后,需要我们后台这边将excel表格信息中的内容全部插入到数据表中.当然,前提是用户给我们的excel表格中的信息必须和我们表中 ...

  8. Python数据分析实战【七】:用Python实现对Excel文件中的数据进行md5加密【文末源码地址】

    文章目录 获取数据 加密函数 数据加密 结尾 源码地址 本文可以学习到以下内容: 使用 pandas 中的 to_excel 生成 excel 数据 使用 pandas 中的 read_excel 读 ...

  9. 使用SSIS包将多个Excel文件中的数据导入SQL Server表中

    This article explores an SSIS package for importing multiple Excel files data into SQL Server tables ...

最新文章

  1. 动态规划——最长公共子序列(LCS)
  2. [你必须知道的.NET] 开篇有益
  3. 使用Java Mail接收 Gmail 电子邮件
  4. ECharts初体验(下载使用步骤、vscode取色器插件)
  5. 主编编辑器如何绑定公众号?
  6. 语音识别机器人课设Linux,机器人语音识别实验设计与实现
  7. CS5211|EDP转LVDS方案介绍|CS5211电路设计
  8. 考研数学笔记1-常数项级数的审敛法思路
  9. 关于密码测评,你必须了解的10个基本问题
  10. 基于TCP的网络实时聊天室(socket通信案例)
  11. GPT介绍-GUID分区表
  12. 广州天象网络技术有限公司分享在北上广月薪没过万是种怎样的体验
  13. DCloud旗下的uni-app如何判断是否安装腾讯QQ微信微博支付宝淘宝客户端
  14. 在安卓手机上安装Ubuntu详细教程(无需root)
  15. shell之cut ---sed---awk--sort
  16. OSChina 周二乱弹 ——爸爸陆陆续续回家了
  17. 阿里达摩院的AI Earth(AIE)初体验
  18. php框架自动采影视资讯,自动采集电源视频影视小程序源码ThinkPHP5框架
  19. ignore的音标_英语ignore的意思解释|读音发音|相关词语_英语词典_词林在线词典...
  20. os.listdir(path)避坑指南

热门文章

  1. Tomcat优化总结
  2. 【SPFA + DFS/BFS】最短路的一个拓展题
  3. java什么是classpath_Java 基础 - CLASSPATH 到底是什么
  4. c语言中signal函数详细说明--举例
  5. Python编程:从入门到实践+爬虫开发与项目实战+网络编程基础+项目开发实战
  6. 关于builder模式的使用
  7. 表观修饰的“当红炸子鸡” - 组蛋白乳酸化
  8. 黑马程序员--C语言自学笔记---07预处理、进制、机器码
  9. 微信小程序的消息推送的token的配置
  10. 三年登顶,浪潮新一代超融合开始冲刺