使用JAVA读取和写入EXCEL文件
2023-09-11 14:17:08 时间
下载地址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));
}
}
相关文章
- Java 并发工具包 java.util.concurrent 用户指南
- JVM详解之:java class文件的密码本
- Java VS .NET:Java与.NET的特点对比 单点登录(SSO)的设计
- 第一章 Java的I/O演进之路
- 回归JAVA: java文件编译后,出现xx$1.class的原因
- [转]用JAVA在读取EXCEL文件时如何判断列隐藏
- Tomcat 奔溃:java.lang.OutOfMemoryError: Java heap space
- Java 设计模式之桥接模式,Java 桥接模式 ,java Bridge Pattern
- Java poi Excel导出文件,Java poi 分批次导出大批量数据
- Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类
- Python Excel教程之如何将多个 excel 文件合并为一个文件(教程含源码)
- Python Excel自动化之 如何根据某一列快速对比两excel文件不同并输出不同内容
- Python Excel教程之如何将多个 excel 文件合并为一个文件(教程含源码)
- Java学习-018-EXCEL 文件写入实例源代码
- Java学习-017-EXCEL 文件读取实例源代码
- Java 实现对Sql语句解析
- excel-合并多个Excel文件--VBA合并当前目录下所有Excel工作簿中的所有工作表
- JAVA_用Java来获取访问者真实的IP地址
- Hbase之Java API远程访问Kerberos认证
- Java实现Excel导入和导出
- Java学习---Excel读写操作
- java集合 线程安全
- C++调用Java的Jar包
- Eclipse迅速执行:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
- java poi 向excel写入图片
- Java实现图片粘贴到excel
- Java JDBC调用SqlServer存储过程 结果集为空
- poi和easyExcel基于Java操作Excel学习笔记
- java导入导出excel
- Java导入Excel