使用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));
    }
}


相关文章
|
10天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
21天前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
89 5
|
1月前
|
Java
Java“解析时到达文件末尾”解决
在Java编程中,“解析时到达文件末尾”通常指在读取或处理文件时提前遇到了文件结尾,导致程序无法继续读取所需数据。解决方法包括:确保文件路径正确,检查文件是否完整,使用正确的文件读取模式(如文本或二进制),以及确保读取位置正确。合理设置缓冲区大小和循环条件也能避免此类问题。
|
14天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
37 2
|
21天前
|
Java API Apache
|
23天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
24天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
34 4
|
27天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
27天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
28天前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
下一篇
无影云桌面