-Java连接Excel、MySQL、SQLServer数据源及相关增、删、改、查方法和问题总结-【Part I】
2017-04-20 12:43
766 查看
【Part I】-Java连接Excel数据源及相关增、删、改、查方法和问题总结-
一、前言
在项目中,经常会遇到需要读取数据源数据并进行处理的场景,数据源通常为Excel、MySQL、SQLServer三种,不久前,我刚好参加了这样一个项目,同时涉及到了上述三种数据源,中途也踩了一些坑,因此,觉得有写一个总结的必要,希望对读到这篇文章的人能够有所帮助。二、准备工作
需要下载一个jar包——jxl.jar,并通过:Build Path -> Configure Build Path -> Add External JARs 将jxl.jar导入到工程的Referenced Libraries中。注意:jxl.jar包目前只支持office2003及之前版本,即.xls格式三、增、删、改、查的实现
3.1 读取Excel表中的数据
这里,我仅仅以读取double类型数据举例说明,其它数据类型与之类似public ArrayList<Double> getDataFromExcel(int numOfData,int ColumNum) { //创建一个用于返回数据的数据集 ArrayList<Double> dataSet=new ArrayList<Double>(); //创建一个文件路径名 File file = new File("C:\\Users\UserName\\Desktop\\changxing.xls"); Cell[] cellData=new Cell[numOfData]; try { //创建一个输入流 InputStream in = new FileInputStream(file); //创建一个工作簿 Workbook workbook_in = Workbook.getWorkbook(in); //通过工作簿获取第一张Sheet表(索引号为0) //我们既可能通过Sheet的名称来访问它,也可以通过下标来访问它。如果通过下标来访问的话,要注意的一点是下标从0开始,就像数组一样。 Sheet sheet0 = workbook_in.getSheet(0); //Test1:可以通过指定行和列得到指定的单元格Cell对象 Cell c00 = sheet0.getCell(3, 5); //读取第3行第5列中的数据 Cell[] temp1 = sheet0.getColumn(2);//读取第2列的数据 Cell[] temp2 = sheet0.getRow(3);//读取第3行数据 System.out.println(c00.getContents()+";"+temp1[0].getContents()+";"+temp2[0].getContents()); //Test2:可以得到某一行或者某一列的所有单元格Cell对象 cellData = sheet0.getColumn(ColumNum);//读取一列数据ColumNum代表列号 } catch(Exception e) { System.out.println("读取数据失败!"); } //Test3:可以将通过Cell获取到的Excel中的数据读入dataSet中,以便返回 for(int i=0;i<cellData.length;i++) { //为了保证精度的特殊处理,如果读取的数据类型是double或者float,采用getContents() //仅仅默认保留三位小数,精度有可能不够,而通过下面的处理可以保证精度。当然,如果是其它 //数据类型,如String,则可直接采用getContents()方法 NumberCell cell = (NumberCell) cellData[i]; double data = cell.getValue(); dataSet.add(data); } return dataSet;//返回读取到的指定列、指定数量的数据集 }
3.2 创建并向Excel表中的写入数据
/** * 创建Excel文件并向其中写入数据 * @param fileName:指定创建文件的路径和文件名构成的字符串 * 注:如果只有文件名,则创建的文件将位于工作空间的默认目录下 */ public static void writeExcel(String fileName){ WritableWorkbook wwb = null; try { //首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象 wwb = Workbook.createWorkbook(new File(fileName)); } catch (IOException e) { e.printStackTrace(); } if(wwb!=null) { //创建一个可写入的工作表 //Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置 WritableSheet ws = wwb.createSheet("自定义工作表名称", 0); //下面开始添加单元格 for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ //这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行 Label labelC = new Label(j, i, "第"+(i+1)+"行,第"+(j+1)+"列的内容"); try { //将生成的单元格添加到工作表中 ws.addCell(labelC); } catch (RowsExceededException e) { e.printStackTrace(); } catch (WriteException e) { e.printStackTrace(); } } } try { //从内存中写入文件中 wwb.write(); //关闭资源,释放内存 wwb.close(); } catch (IOException e) { e.printStackTrace(); } catch (WriteException e) { e.printStackTrace(); } } }
3.3 查询、修改Excel表中的数据
/** * 查询并替换掉Excel文件中的指定内容 * @param fileName * @param sheetNum:0、1、2..n,分别代表Excel中的第n张表 */ public static void updateExcel(String fileName,int sheetNum) { File f = new File(fileName); try { Workbook wb = Workbook.getWorkbook(f);// WritableWorkbook book = wb.createWorkbook(f, wb); // 获得第一个工作表对象,sheetNum从0开始 WritableSheet st = book.getSheet(sheetNum); for (int i = 0; i < st.getRows(); i++) { for (int j = 0; j < st.getColumns(); j++) { Cell cel = st.getCell(j,i); //查询:输出全部原始内容 System.out.println(cel.getContents()); //修改:修改指定原始内容 if(cel.getContents().equals("原始内容")) { Label label = new Label(j, i, "替换内容"); st.addCell(label); } } } book.write(); book.close(); wb.close(); } catch (Exception e) { e.printStackTrace(); } }
3.4 删除Excel表中指定的列(行与之类似)
/** * 从Excel中删除指定的列 * @param fileName:Excel文件路径+文件名构成的字符串 * @param sheetNum:0、1、2...n待删除数据对应的表序号 * @param columnNum:0、1、2...n待删除的表对应的列 */ public void removeColumnFromExcel(String fileName,int sheetNum,int columnNum) { File f = new File(fileName); try { Workbook wb = Workbook.getWorkbook(f);// WritableWorkbook book = wb.createWorkbook(f, wb); // 获得第一个工作表对象,sheetNum从0开始 WritableSheet st = book.getSheet(sheetNum); //删除指定的列 st.removeColumn(columnNum); book.write(); book.close(); wb.close(); } catch (Exception e) { e.printStackTrace(); } }
四、注意问题
精度问题:通过如下程序读取Excel中的单元格内容,如果数据是浮点型(double或float),默认读取的内容只能保留三位小数,在一些需要高精度计算的情况下,往往不能满足实际需要。Cell cel = st.getCell(j,i); System.out.println(cel.getContents());
因此,改用其它方法:
NumberCell cell = (NumberCell) cellData[i]; double data = cell.getValue();
相关文章推荐
- -Java连接Excel、MySQL、SQLServer数据源及相关增、删、改、查方法和问题总结-【Part III】
- -Java连接Excel、MySQL、SQLServer数据源及相关增、删、改、查方法和问题总结-【Part II】
- MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结
- java连接mysql 乱码的问题的解决方法
- 【JAVA】 Java、JSP连接数据库方法类(MySQL、Oracle、SQLServer)
- Java/JSP程序连接不上Mysql驱动问题解决方法
- (转)MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结
- JAVA之JDBC的相关问题(无法与SQLServer连接的解决)
- Java连接mysql中遇到的一些问题及解决方法
- Java连接mysql中遇到的一些问题及解决方法
- [ASP/PHP/JSP]MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结
- php无法连接mysql问题解决方法总结
- SQLSERVER,ORACLE,MYSQL的分页与java连接字符串总结
- python安装,连接Mysql出现的问题相关总结
- mySql8小时问题总结,DBCP,C3P0数据源配置方法。
- MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结
- MySQL5.0中文问题及JDBC数据库连接和JSP汉字编码问题解决方法总结
- Java连接sqlserver,Mysql,oracle等数据库的方法
- qt、Navicat、mysql连接的相关问题总结
- Java连接mysql中遇到的一些问题及解决方法