您的位置:首页 > 编程语言 > Java开发

-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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: