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

使用JAVA读取和写入EXCEL文件

2014-12-26 12:38 633 查看
下载地址http://download.csdn.net/detail/u010634066/8302683 下载直接用

首先要下载 poi包和jxl包

读取部分:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

/**============================================================
* 版权:
* 包:
* 修改记录:
* 日期                               作者                               内容
* =============================================================
* 2014-12-25       shirenchuang
* ============================================================*/

/**
* @author shirenchuang
*
*/
public class ReadExecl {

/*private String fileUrl;

public ReadExecl(String fileUrl) {
// TODO Auto-generated constructor stub
this.fileUrl = fileUrl;
}*/
// File file = new File(fileUrl);

/**

* 读取Excel的内容,第一维数组存储的是一行中格列的值,二维数组存储的是多少个行

* @param file 读取数据的源Excel

* @param ignoreRows 读取数据忽略的行数,比喻行头不需要读入 忽略的行数为1

* @return 读出的Excel中数据的内容

* @throws FileNotFoundException

* @throws IOException

*/

public static List<String[][]> getData(File file,int ignoreRows) throws IOException{
//返回所有工作表的数据
List<String[][]> result = new ArrayList<String[][]>();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
POIFSFileSystem  fs = new POIFSFileSystem(in);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFCell cell = null;
wb.getNumberOfSheets();
//多个工作表
for(int i=0;i<wb.getNumberOfSheets();i++){
//得到工作表
HSSFSheet hf = wb.getSheetAt(i);
//一个工作表的数据   挤得加上1  比如execl加上第一行的列名 总共66  但是getLastRowNum()是65 把列明也算上
String[][] rowResult = new String[hf.getLastRowNum()+1][7];
//每个工作表的多行
for(int rownumber = ignoreRows; rownumber<=hf.getLastRowNum();rownumber++){

//得到的row的行数不确定的   如果那一行后面有空格  有可能会忽略空格列
HSSFRow row = hf.getRow(rownumber);
if (row == null) {
continue;
}
//一行的数据
String[] colResult = new String[row.getLastCellNum()];
//得到一行的多个列
/**
* 这里有个问题  就是row.getLastCellNum()有个情况得到的不准确
* 例子:EXECL总共7列数据   但是实际上最后几列有的为空,它会默认把空的列不计入列值;
* 导致的错误就是你调用写入方法的时候会有用的列值  会出错;
*
*/
for(short colnumber = 0;colnumber<row.getLastCellNum();colnumber++){
String value="";
cell=row.getCell(colnumber);
//将cell装换类型
if(cell!=null){
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
switch(cell.getCellType()){
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {

Date date = cell.getDateCellValue();

if (date != null) {

value = new SimpleDateFormat("yyyy-MM-dd")

.format(date);

} else {

value = "";

}

} else {

value = new DecimalFormat("0").format(cell

.getNumericCellValue());

}

break;
case HSSFCell.CELL_TYPE_FORMULA:
// 导入时如果为公式生成的数据则无值

if (!cell.getStringCellValue().equals("")) {

value = cell.getStringCellValue();

} else {

value = cell.getNumericCellValue() + "";

}

break;

case HSSFCell.CELL_TYPE_BLANK:

break;

case HSSFCell.CELL_TYPE_ERROR:

value = "";

break;

case HSSFCell.CELL_TYPE_BOOLEAN:

value = (cell.getBooleanCellValue() == true ? "Y"

: "N");

break;

default:

value = "";
}//switch

}//if
if (colnumber == 0 && value.trim().equals("")) {
// break;
}

colResult[colnumber]=rightTrim(value);
}//for()列
rowResult[rownumber]=colResult;
}//for() 行
if(rowResult!=null)
result.add(rowResult);
}//for工作表
in.close();

return result;
}

/**

* 去掉字符串右边的空格

* @param str 要处理的字符串

* @return 处理后的字符串

*/

public static String rightTrim(String str) {

if (str == null) {

return "";

}

int length = str.length();

for (int i = length - 1; i >= 0; i--) {

if (str.charAt(i) != 0x20) {

break;

}

length--;

}

return str.substring(0, length);

}

}


写入部分

import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

/**============================================================
* 版权: 元亨通信 版权所有 (c) 2002 - 2012
* 包:
* 修改记录:
* 日期                               作者                               内容
* =============================================================
* 2014-12-25       shirenchuang
* ============================================================*/

/**
* @author shirenchuang
*
*/
public class WriterExecl {
private static String writeUrl ="";
public String getWriteUrl() {
return writeUrl;
}

public void setWriteUrl(String writeUrl) {
this.writeUrl = writeUrl;
}

public WriterExecl(String writeUrl ) {
// TODO Auto-generated constructor stub
this.writeUrl= writeUrl;
}

/**
*
* 这是单纯的写EXCEL表格
* **/
public static void writeEx(int row,String[][] data){

WritableWorkbook wwb = null;
Label label = null;
String file =writeUrl;
try {
// 创建可写入的工作簿对象

wwb = Workbook.createWorkbook(new File(file));
if (wwb != null) {
// 在工作簿里创建可写入的工作表,第一个参数为工作表名,第二个参数为该工作表的所在位置
WritableSheet ws = wwb.createSheet("test", 0);
if (ws != null) {
/* 添加表结构 */
// 行
for (int i=0;i<row;i++) {
// 列
for (int j=0;j<data[i].length;j++) {
// Label构造器中有三个参数,第一个为列,第二个为行,第三个则为单元格填充的内容

label = new Label(j, i,data[i][j] );
// 将被写入数据的单元格添加到工作表
ws.addCell(label);
}
}
// 从内存中写入到文件
wwb.write();
}
System.out.println("路径为:" + file + "的工作簿写入数据成功!");
}
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
try {
wwb.close();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}


主方法:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class main {

public static void main(String[] args) throws IOException{
ReadExecl re = new ReadExecl();
File file = new File("C:/Users/Administrator/Desktop/test.xls");
WriterExecl we = new WriterExecl("C:/Users/Administrator/Desktop/衢州用户表.xls");
List<String[][]> result = new ArrayList<String[][]>();
//不忽略行 从0开始
result =  re.getData(file, 0);
//有多少行
int row = result.get(0).length;

//写入  传入参数row   不传column  column是不确定的
we.writeEx(row,result.get(0));

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: