java easyreport 导入excel、 txt 数据简单实现(一)

一直在看博客,却不知道怎么写,但是总是想写点什么,犹豫了两三天,决定还是写点东西吧,来和大家分享下。



今年上半年时候接到了一个需求,具体什么需求就不说了,要求导入excel数据,并提示每一行错误信息。接到手后,查看之前的导入excel报表的代码,发现只有初始化workBook和根据cell获取cell 字符串值得通用方法。觉得可利用的东西太少了,于是决定就构建一个通用的实现导入excel报表的工具包。

实现思路大致是这样的:

  1. 提供模板,模板包含读起始行、属性模板集合、读批次、校验出错中端。
  2. 添加属性模板,属性模板包含标题、属性名、字段索引、属性校验对象。
  3. 提供读引擎类,初始化读文件输入流、根据模板读取校验字段、校验错误信息管理、对象分配属性,匹配添加对象。

具体实现方式不做详细讲述,只讲述如何使用,我会把源码提供给大家,源码在com.easyReport.read下,有兴趣的可以读下,欢迎交流。



测试使用DEMO。

首先构建基础测试类BasicTest

package test;

import java.io.FileInputStream;

import java.lang.reflect.ParameterizedType;

import java.util.List;

import java.util.Map;

import org.junit.Test;

import com.easyReport.read.ConvertReader;

import com.easyReport.read.temp.ReadTemp;

public abstract class BasicTest<T> {

//测试执行方法

@Test

public abstract void test();

//构建读引擎

protected abstract ConvertReader buildReader();

//构建读模板

protected abstract ReadTemp bulidReadTemp();

//输出对象信息

protected abstract void writeBeanList(List<T> modelLists);

//输出Map信息

protected abstract void writeMapList(List<Map<String, Object>> mapLists);

@SuppressWarnings("unchecked")

public void testReadBean(FileInputStream fis) throws Exception {

ConvertReader reader = buildReader();

writeBeanList((List<T>) reader.readToBeanList(fis, getModelClass()));

}

public void testReadMap(FileInputStream fis) throws Exception {

ConvertReader reader = buildReader();

writeMapList(reader.readToMapList(fis));

}

protected Class<?> getModelClass() {

return (Class<?>) ((ParameterizedType) (getClass()

.getGenericSuperclass())).getActualTypeArguments()[0];

}

}

构建excel基础类实现读引擎

package test;

import com.easyReport.read.ConvertReader;

import com.easyReport.read.ExcelReader;

import com.easyReport.read.ReaderContext;

public abstract class AbstractExcelTest<T> extends BasicTest<T> {

@Override

protected ConvertReader buildReader() {

return new ExcelReader(new ReaderContext(bulidReadTemp()));

}

}

构建txt基础类实现读引擎

package test;

import com.easyReport.read.ConvertReader;

import com.easyReport.read.ReaderContext;

import com.easyReport.read.TxtReader;

public abstract class AbstractTxtTest<T> extends BasicTest<T> {

@Override

protected ConvertReader buildReader() {

return new TxtReader(new ReaderContext(bulidReadTemp()));

}

}



test.xls报表数据

姓名 年龄 科目 分数
王老五 12 语文 80

Excel导入

package example;

import java.io.File;

import java.io.FileInputStream;

import java.util.List;

import java.util.Map;

import model.Student;

import test.AbstractExcelTest;

import com.easyReport.read.temp.PropertyTemp;

import com.easyReport.read.temp.ReadTemp;

public class TestExcelSimple extends AbstractExcelTest<Student> {

@Override

public void test() {

FileInputStream fileInputStream;

try {

fileInputStream = new FileInputStream(new File("testFile/test.xls"));

testReadBean(fileInputStream);

// testReadMap(fileInputStream);

fileInputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

protected ReadTemp bulidReadTemp() {

ReadTemp readTemp = new ReadTemp(1);

readTemp.addPropertyTemp(new PropertyTemp("姓名", "name"));

readTemp.addPropertyTemp(new PropertyTemp("年龄", "age"));

readTemp.addPropertyTemp(new PropertyTemp("科目", "course.name"));

readTemp.addPropertyTemp(new PropertyTemp("分数", "course.score"));

return readTemp;

}

@Override

protected void writeBeanList(List<Student> modelLists) {

System.out.println("--------------bean---------------");

for (Student s : modelLists) {

System.out.println(s.getName() + "|"+s.getAge()+s.getCourse().getName()+"|"+s.getCourse().getScore());

}

}

@Override

protected void writeMapList(List<Map<String, Object>> mapLists) {

System.out.println("--------------map---------------");

for (Map<String, Object> m : mapLists) {

System.out.println(m.get("name") + "|" + m.get("age")+"|" + m.get("course.name")+"|" + m.get("course.score"));

}

}

}

运行结果:

--------------bean---------------

王老五|12语文|80.0

切换至testReadMap(fileInputStream),运行结果:

--------------map---------------

王老五|12.0|语文|80.0



test.txt数据

姓名|年龄|科目|年龄

王老五|12|语文|80

Txt导入

package example;

import java.io.File;

import java.io.FileInputStream;

import java.util.List;

import java.util.Map;

import model.Student;

import test.AbstractTxtTest;

import com.easyReport.read.temp.PropertyTemp;

import com.easyReport.read.temp.ReadTemp;

import com.easyReport.read.temp.TxtReadTemp;

public class TestTxtSimple extends AbstractTxtTest<Student> {

@Override

public void test() {

FileInputStream fileInputStream;

try {

fileInputStream = new FileInputStream(new File("testFile/test.txt"));

testReadBean(fileInputStream);

// testReadMap(fileInputStream);

fileInputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

protected ReadTemp bulidReadTemp() {

TxtReadTemp readTemp = new TxtReadTemp(1);

readTemp.setSplit("\\|");//默认,或,分割符

readTemp.addPropertyTemp(new PropertyTemp("姓名", "name"));

readTemp.addPropertyTemp(new PropertyTemp("年龄", "age"));

readTemp.addPropertyTemp(new PropertyTemp("科目", "course.name"));

readTemp.addPropertyTemp(new PropertyTemp("分数", "course.score"));

return readTemp;

}

@Override

protected void writeBeanList(List<Student> modelLists) {

System.out.println("--------------bean---------------");

for (Student s : modelLists) {

System.out.println(s.getName() + "|"

+ s.getAge()+s.getCourse().getName()+"|"+s.getCourse().getScore());

}

}

@Override

protected void writeMapList(List<Map<String, Object>> mapLists) {

System.out.println("--------------map---------------");

for (Map<String, Object> m : mapLists) {

System.out.println(m.get("name") + "|" + m.get("age")+"|" + m.get("course.name")+"|" + m.get("course.score"));

}

}

}

运行结果:

--------------map---------------

王老五|12|语文|80

easyreport依赖jar包

时间: 2024-11-05 18:51:16

java easyreport 导入excel、 txt 数据简单实现(一)的相关文章

java easyreport 导入excel、 txt 数据txt按字节导入(七)

有时候导入txt文件不一定是采用分隔符方式导入,而是采用按字节.字符长度导入,比如银联对账文件. 导入txt数据 姓名 年龄科目分数 陈寻  12语文67 王老五12语文80 柯景腾13语文78 沈佳宜14语文88 王小贱15语文60 黄小仙12语文54 李大仁14语文76 程又青13语文58 方茴  12语文87 沈晓棠13语文89 林嘉茉14语文68 赵烨  14语文50 苏凯  12语文78 乔燃  13语文90 我们采用iso8859-1单字节编码读取文件数据,一个汉字占2字节. 导入d

java easyreport 导入excel、 txt 数据数据格式校验(六)

在大部分情况下我们需要对导入数据的内容.格式进行合法性验证,验证不通过需要我们提示错误信息. 导入xls数据内容 姓名 年龄 科目 分数 王老五 12 语文 80 柯景腾 13 语文 78 沈佳宜 14 语文 88 王小贱 15 语文 60 黄小仙 12 语文 54 李大仁 14 语文 76 程又青 13 语文 58 陈寻 12 语文 67 方茴 12 语文 87 沈晓棠 13 语文 89 林嘉茉 14 语文 68 赵烨 14 语文 50 苏凯 12 语文 78 乔燃 13 语文 90 我们需要

java easyreport 导入excel、 txt 数据关联集合置入对象(三)

接上一节,获取的Student关联的Teacher集合有且只有一个,如何置入多个呢. 自定义StudentMatcher实现MatchAbled方法 package matcher; import java.util.List; import java.util.Map; import model.Student; import com.easyReport.read.MatchAbled; public class StudentMatcher implements MatchAbled<St

java easyreport 导入excel、 txt 数据复合属性(二)

在导入报表的时候,经常会遇到对象属性是集合或数组形似的,如学生会有多个老师,那么这种属性是集合或数组形式的报表如何设置,以及导入呢. Teacher类 package model; public class Teacher { private String name; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; }

java easyreport 导入excel、 txt 数据行列索引(四)

姓名 年龄 科目 分数 教师姓名 教师性别 王老五 12 语文 80 张三丰 男 我们要求导入数据中不包含科目和分数. 导入demo TestExcelIndex类 package example; import java.io.File; import java.io.FileInputStream; import java.util.List; import java.util.Map; import model.Student; import test.AbstractExcelTest;

java easyreport 导入excel、 txt 数据批量读取(五)

有时候我们需要读的报表数据很大,这时候一次加载所有数据有可能会出现内存溢出,所以我们需要采用批量读取来实现. 导入数据test5.xls 姓名 年龄 科目 分数 王老五 12 语文 80 柯景腾 13 语文 78 沈佳宜 14 语文 88 王小贱 15 语文 60 黄小仙 12 语文 54 李大仁 14 语文 76 程又青 13 语文 58 陈寻 12 语文 67 方茴 12 语文 87 沈晓棠 13 语文 89 林嘉茉 14 语文 68 赵烨 14 语文 50 苏凯 12 语文 78 乔燃 1

Java版将EXCEL表数据导入到数据库中

1.采用第三方控件JXL实现 try { //实例化一个工作簿对象 Workbook workBook=Workbook.getWorkbook(new File("F://qzlx.xls")); //获取该工作表中的第一个工作表 Sheet sheet=workBook.getSheet(0); //获取该工作表的行数,以供下面循环使用 int rowSize=sheet.getRows(); for(int i=0;i<rowSize;i++) { //编号 String

c#导入excel 绑定数据 repeat为例子

先读取Excel文件并存到dataset 1 public DataSet ExcelToDataTable(string filename, string strsheetname) 2 { 3 try 4 { 5 //源的定义 6 string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filename + ";" + "Extended Pro

点餐小程序,点餐系统,管理后台批量导入excel菜品数据

点餐系统上线这段时间,有好多同学反馈,是否可以添加一个菜品批量导入的功能.由于平时比较忙,一直没有时间把菜品批量导入的功能加进来.今天正好空出来时间了,就来教大家实现下菜品批量导入的功能. 后面会把这节功能录制成视频放到点餐系统的课程里. 传送门:" rel="nofollow">点餐系统,java后台+点餐小程序 老规矩,先看效果图 选择excel菜品导入数据成功 之前有看过我课程的同学肯定知道,我之前是没有批量导入的类目的,不错,这个类目就是我们今天新加的功能. 实