使用JAVA读取和写入EXCEL文件

简介: 使用JAVA读取和写入EXCEL文件

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


相关文章
|
1月前
|
Java
有关Java发送邮件信息(支持附件、html文件模板发送)
有关Java发送邮件信息(支持附件、html文件模板发送)
31 1
|
1月前
|
监控 数据处理 索引
使用Python批量实现文件夹下所有Excel文件的第二张表合并
使用Python和pandas批量合并文件夹中所有Excel文件的第二张表,通过os库遍历文件,pandas的read_excel读取表,concat函数合并数据。主要步骤包括:1) 遍历获取Excel文件,2) 读取第二张表,3) 合并所有表格,最后将结果保存为新的Excel文件。注意文件路径、表格结构一致性及异常处理。可扩展为动态指定合并表、优化性能、日志记录等功能。适合数据处理初学者提升自动化处理技能。
23 1
|
1月前
|
Java
java中替换文件内容
java中替换文件内容
14 1
|
1月前
|
安全 Java 数据库连接
jdbc解析excel文件,批量插入数据至库中
jdbc解析excel文件,批量插入数据至库中
21 0
|
1月前
|
Java API
Java中文件与输入输出
Java中文件与输入输出
|
1月前
|
Java
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
java实现遍历树形菜单方法——映射文件VoteTree.hbm.xml
10 0
|
1月前
|
Java
java程序导出堆文件
java程序导出堆文件
|
1月前
|
SQL Oracle Java
sql文件批处理程序-java桌面应用
sql文件批处理程序-java桌面应用
25 0
|
5天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
33 3
|
17小时前
|
存储 前端开发 Java
Java实现文件分片上传
Java实现文件分片上传
4 0