写点什么

使用 JAVA 读取和写入 EXCEL 文件

  • 2023-02-28
    江西
  • 本文字数:4557 字

    阅读完需:约 15 分钟

下载地址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 分钟前阅读数: 6
用户头像

关注公众号: 石臻臻的杂货铺 获取最新文章 2019-09-06 加入

进高质量滴滴技术交流群,只交流技术不闲聊 加 szzdzhp001 进群 20w字《Kafka运维与实战宝典》PDF下载请关注公众号:石臻臻的杂货铺

评论

发布
暂无评论
使用JAVA读取和写入EXCEL文件_Java_石臻臻的杂货铺_InfoQ写作社区