下载地址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));
- }
- }