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


相关文章
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
79 9
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
2月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
146 5
|
3天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
46 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
24天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
30天前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
31 6
按条件将Excel文件拆分到不同的工作表
|
29天前
|
Python
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
39 6
|
29天前
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
39 6
|
2月前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
32 1
|
2月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
73 6