中企动力 > 商学院 > java上传excel
  • ?

    Java互联网架构-高性能异步框架

    Honoria

    展开

    序言

    com.lietoumon.asyn4j 封装了一个异步方法调用框架,包括了异步方法执行、异步回调执行、异步方法持久化并且支持Spring.

    功能:

    异步工作可以设置执行权重

    支持异步回调

    任务持久化及恢复功能

    Spring 支持

    定期打印任务运行状态信息

    一丶普通调用方法

    例子:

    主方法

    public static void main(String[] args) {

    // 初始化异步工作服务

    // 默认参数,队列长度:10000,添加时间:10毫秒,工作线程数:cpu个数,回调线程数:cpu个数,停止服务时间:5秒

    AsynService asynService = AsynServiceImpl.newInstance();

    // 自定义参数

    AsynService anycService = AsynServiceImpl.newInstance(10000, 10L, 100, 50, 5000);

    // 异步工作持久化工作器

    // 参数,保存目录;监测时间,单位秒

    RejectedHandler rejectedHandler = new ScheduledRejectedHandler("/Users/yuanxl/empolder/tmp", 600);

    anycService.setRejectedHandler(rejectedHandler);

    // 异步工作异常处理器

    anycService.setErrorHandler(new DefaultErrorHandler());

    // 异步工作合并处理器,自有批量执行需要合并结果的时候需要

    // ResultMergeHandler merge = new TestMerge()

    // asynService.setResultMergeHandler(resultMergeHandler);

    // 启动服务

    asynService.init();

    // 添加任务,example

    TestService testService = new TestService();

    Class[] type = { int.class };

    for (int i = 0; i < 1000; i++) {

    // 添加异步工作- TestService 的 incr 方法 ,方法参数 i

    asynService.addJob(testService, "incr", type, new Object[] { i });

    // 添加异步且回调工作

    asynService.addJob(testService, "incr", type, new Object[] { j }, new TestCallback());

    }

    // 停止服务

    asynService.close();

    异步调用对象

    public class TestService {

    public String incr(int num) {

    //System.out.println("incr: " + num);

    return num + 1 + "";

    回调方法

    //回调需继承AsynCallback抽象类

    public class TestCallback extends AsynCallback {

    private static final long serialVersionUID = -9078828850204151543L;

    @Override

    public void doNotify() {

    System.out.println("before callback value=" + methodResult);

    System.out.println("after callback value=" + methodResult + " done");

    结果合并器

    public class TestMerge implements ResultMergeHandler {

    private static final long serialVersionUID = -3514693047424233341L;

    public Object merge(Object a, Object b) {

    if (a == null) {

    return b;

    if (b == null) {

    return a;

    Integer num = (Integer)a;

    Integer num1 = (Integer)b;

    return num + num1;

    二丶调用Spring Bean的异步方法.(推荐使用spring)

    调用 Spring TestService 的 incr 方法

    applicationContext.xml 加入

    class="com.lietoumon.asyn4j.core.handler.ScheduledRejectedHandler">

    public class TestMain {

    public AsynService asynService;

    public void setAsynService(AsynService asynService) {

    this.asynService = asynService;

    public void test(){

    for(int i=0; i<10000; i++){

    asynService.addJobBySpring("testService", "incr", type, new Object[] { j });

    三丶相关处理器

    异步持久化工作器--(当工作队列工作数超过queueCapacity时由处里器处理,包括服务启动和关闭调用)

    当工作队列中的工作超过10000个时,异步工作将由ScheduledRejectedHandler处理;

    将任务持久化到文件,当系统启动时加载文件内容并执行,关闭时将未执行的任务持久化到文件。

    可以自定义处理器,继承 RejectedHandler 抽象类即可。

    异步工作异常处理器--(当工作执行出现异常时处理器)

    自定义处理器,继承 ErrorHandler 抽象类即可。

    异步工作合并处理器--(只有批量执行需要合并结果的时候才需要)

    asynService.setResultMergeHandler(new TestMerge());

    自定义处理器,继承 ResultMergeHandler 接口即可。

    四丶异步工作优先级

    分成三个等级JobPriority.MIN, JobPriority.NORM, JobPriority.MAX 默认优先级为JobPriority.NORM。

    五丶API使用说明

    默认构造函数,创建一个异步服务

    AsynServiceImpl.newInstance();

    采用的默认参数为:

    (queueCapacity)最大工作队列缓存工作数 – 10000(默认值)

    (addJobWaitTime)当工作队列满时添加工作等待时间-- 10ms(默认值)

    (jobThreadNum)异步工作执行线程池大小 ---- CPU核数/2 +1(默认值)

    (callbackThreadNum)回调执行线程池大小 — CPU核数/2(默认值)

    (closeServiceWaitTime) 服务关闭等待时间 ---- 5000s(默认值)

    自定义参数构造函数,参数顺序对应前面的说明

    AsynServiceImpl.newInstance (100000, 0L, 100, 50, 3000);

    AsynServiceImpl 是线程安全的,可以初始化一个实例,所有程序再引用.

    启动关闭服务

    /**

    * 启动服务

    */

    public void init();

    * 关闭服务

    public void close();

    添加任务接口API

    * 添加异步工作

    *

    * @param targetObject -- 目标对象(可以是 Class或Object)

    * @param method -- 目标方法

    public void addJob(Object targetObject, String method);

    * @param targetObject -- 目标对象(可以是 Class,Object)

    * @param method -- 目标方法

    * @param priority -- 优先级

    public void addJob(Object targetObject, String method, JobPriority priority);

    * @param paramTypes -- 目标方法参数类型

    * @param paramsValues -- 目标方法参数值

    public void addJob(Object targetObject, String method, Class[] paramTypes, Object[] paramsValues);

    public void addJob(Object targetObject, String method, Class[] paramTypes, Object[] paramsValues,

    JobPriority priority);

    * @param asynCallback -- 回调对象

    AsynCallback asynCallback);

    AsynCallback asynCallback, JobPriority priority);

    * 批量添加异步工作

    * @param paramsValues -- 目标方法参数值,list

    public void addJobs(Object targetObject, String method, Class[] paramTypes, ListparamsValues,

    * @param beanId -- springId

    public void addJobBySpring(String beanId, String method);

    * @param priority -- 优先级

    public void addJobBySpring(String beanId, String method, JobPriority priority);

    public void addJobBySpring(String beanId, String method, Class[] paramTypes, Object[] paramsValues);

    public void addJobBySpring(String beanId, String method, Class[] paramTypes, Object[] paramsValues,

    * @param asynCallback -- 回调方法

    public void addJobsBySpring(String beanId, String method, Class[] paramTypes, ListparamsValues,

    六丶注意

    由于需要持久化任务,回调类及批量结果合并类需要实现序列化。

    当目标对象是class是,类必须有无参构造函数。

    总结

    以上是对高性能异步框架,分享给大家,希望大家可以了解什么是高性能异步框架。觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持。(吹一波,233~~)

    Java小马哥,头条出品,每天一篇干货,喜欢就收藏+关注

  • ?

    JDBC封装/Java处理excel/WEB基础知识

    方妙海

    展开

    对JDBC的封装?

    1.将变的内容以参数形式传入

    2.将不变的固定下来

    Java处理EXCEL?【JXL】

    1.读

    2.写

    WEB基础知识

    第一、两种架构

    1.C/S:Client /Server 客户端 服务器 模式

    QQ 360 大型网络游戏

    2.B/S:Browser/Server 浏览器 服务器 模式

    网站 应用系统 页游

    第二、网络中的计算机,进行通信,所遵循的规范,称之为协议。

    第三、在JAVAWEB中,客户端和服务器进行交互遵循的是HTTP协议。

    第四、HTTP是一种建立在TCP协议基础之上,基于请求、响应模式的无状态的应用层协议。

    第五、请求:从客户端发往服务器的信息【字符串】。

    1.请求行 请求的方法 资源 协议版本HTTP/1.1

    2.请求头 Host Accept Accept-language....

    3.空格

    4.消息体 key1=value1&key2=value2

    第六、响应: 从服务器返回到客户端信息【字符串】

    1.状态行 协议版本 状态码 状态字符串

    2.响应头 Content-Type Conent-length cookie: .....

    3.空格

    4.响应正文

    第七、浏览器:能够发出标准的HTTP请求,并可以解析标准的HTTP响应的软件(一堆别人写的代码(不一定使用JAVA))

    第八、WEB服务器:是一种能够接受标准的HTTP请求,返回标准的HTTP响应的软件。

    第九、Tomcat就是一款免费的开源的纯JAVA实现的WEB服务器。

    第十、Servlet/JSP容器:提供了Servlet运行环境,管理Servlet的生命周期的一个组件(一堆类,零件)。一般容器存在于服务器中。比如:Tomcat中就有一个servlet容器catalina

    第十一、Servlet=JAV代码+HTML标签(以JAVA代码为主) JSP=HTML标签+JAVA代码(以标签为主)

  • ?

    纯前端表格控件SpreadJS与Java结合,实现模板上传和下载等功能

    小秋

    展开

    安装部署:

    开发环境:

    后台服务器端采用 Java 、SpringMVC。数据存储到 \demo_web\WEB-INF\FileDatabase.txt 文件中,不需要依赖 DB。采用 Eclipse Java EE IDE for Web Developers,Eclipse Version: Photon Release (4.8.0)。服务器:tomcat-7.0.90。工程导入eclipse:

    demo_web.zip 是直接将 eclipse 工程打成的压缩包。

    您可直接解压到 eclipse 的 workspace 下,导入 Existing Projects into Workspace 工程即可。

    部署方法:

    配置 tomcat 与 eclipse 关联,将工程 add 进 tomcat 应用列表,启动 tomcat 即可。

    操作步骤:

    访问:

    在本机部署时,可以通过 http://127.0.0.1:8080/demo_web/view?path=index 访问主页。

    创建模板:

    创建模板分为三种模板类型:表单绑定、单元格绑定、表格绑定。demo_web 压缩包中还包含了三个模板 SSJSON 文件:表单绑定示例、单元格绑定示例以及表格绑定示例,可供用户进行创建模板的操作。表单绑定预览区域说明:如果选择模板类型下拉菜单,预览区域会随模板类型不同而发生变化,单元格绑定和表格绑定只有 ssjson 模板预览一个区域。如图:

    图1:创建表单绑定模板页面

    4.表单模板上传成功后,预览页面的效果如下图:

    图2:上传表单绑定模板后的预览效果

    5.如果需要上传单元格绑定模板或者表格绑定模板,需要先点击“类型”下拉菜单,选中对应类型后再执行上传操作。

    6.在上传完模板并填写完模板基本信息后,点击保存按钮即可。

    管理模板:

    管理模板列表中展示了系统中已创建的模板信息。点击对应模板的下载按钮,可以下载该模板的ssjson文件,可以直接导入至SpreadJS 设计器中进行修改。点击对应模板的填报按钮,可以进入表格填报页面。填报:

    以表单绑定模板为例,如图所示:

    图3:表单绑定模板填报页面示例

    2.新建:重新载入当前模板,不保留已经填写的所有数据。

    3.新行:为填报数据添加一个新行,对应绑定的dataSource多一个数据元素(单元格绑定模板无此按钮)。

    4.保存:将填报数据保存到后台文件中。

    5.历史:当前模板填报提交的历史数据。

    历史数据列表:

    如图:点击查看可以查询本次填报的历史数据。

    图4:填报历史数据列表页面

    历史数据:

    如图:

    图5:填报历史数据页面

    QA:

    Q:局域网无法访问?

    A:此Demo中采用的SpreadJS控件是未授权的,只能在本机操作。

    Q:表单绑定模板,怎样自定义绑定字段?

    A:您可以将表单绑定模板示例.ssjson导入到设计器中查看,表单绑定模板第一行是dataSource对应的字段名,第二行为展示的字段名,第三行为表格对应的样式。

    Q:单元格绑定模板,怎样自定义绑定字段?

    A:您可以将单元格绑定模板示例.ssjson导入到设计器中查看,绑定dataSource对应的字段名是以 [field] 的方式定义在对应的单元格中。

    Q:表格绑定模板,怎样自定义绑定字段?

    A:在表格模板中表头下面的第一行中,可以 [field] 的方式定义列名,在代码中可以创建new GC.Spread.Sheets.Tables.TableColumn() 实例,用以映射列名与绑定字段的关系,具体方法可以参考官网的学习指南中表格绑定的demo。

    本demo中也采用了这个方法。

    Q:表格填报时,新行的样式与前面的行不匹配?

    A:由于表格的模板设计样式非常灵活多样,因此本demo只采用了复制上一行样式的方式对新行进行设置,具体应用当中可以根据需求自行设置表格样式。

    关于葡萄城

    赋能开发者!葡萄城公司成立于 1980 年,是全球领先的集开发工具、商业智能解决方案、管理系统设计工具于一身的软件和服务提供商。西安葡萄城是其在中国的分支机构,面向全球市场提供软件研发服务,并为中国企业的信息化提供国际先进的开发工具、软件和研发咨询服务。葡萄城的控件和软件产品在国内外屡获殊荣,在全球被数十万家企业、学校和政府机构广泛应用。

  • ?

    集算器协助java处理多样性数据源之Excel

    安布里泽特

    展开

    Java程序员读取和计算excel的程序一般要使用poi或其它开源包,这些开源包对编程的支持较为底层,整体学习成本和操作复杂度都很高。使用集算器辅助java处理excel文件就可以避免这些事务。

    下面通过一个例子看一下具体作法:从Excel文件orders.xls中读取订单信息,找出2010年1月1日(含)之后,SELLERID等于18的订单。orders.xls的内容如下:

    实现的思路是:用Java程序调用集算器脚本,读取和计算excel文件中的数据,之后将结果以ResultSet的方式返回给Java程序。由于集算器支持动态表达式解析和求值,使得Java程序可以像使用sql那样,灵活的处理数据。

    首先,程序员可以将条件“2010年1月1日(含)之后,并且SELLERID等于18的订单。”作为参数where传递给esProc程序,如下图:

    where是个字串,其值为:ORDERDATE>=date(2010,1,1) && SELLERID==18。

    esProc的程序代码如下:

    A2:按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.select(ORDERDATE>=date(2010,1,1) && SELLERID==18)。A1:定义一个file对象,导入excel数据。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。importxls函数也可以读写xlsx文件,它会根据文件扩展名自动判断excel的版本。

    A3:将符合条件的结果集返回给java。如果需要将结果写入另外一个excel文件,只要将A3单元格改为:=file("D:/file/orders_result.xls").exportxls@t(A2)。

    过滤条件发生变化时不用改变程序,只需改变where参数即可。例如,条件变为:2010年1月1日(含)之后,并且SELLERID等于18的订单,或者CLIENT等于PWQ的订单。Where的参数值可以写为:CLIENT=="PWQ"||ORDERDATE>=date(2010,1,1) && SELLERID==18。执行之后,A2中的结果集如下图:

    在Java程序中使用esProc JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx):

    //建立esProc jdbc连接

    Class.forName("com.esproc.jdbc.InternalDriver");

    con= DriverManager.getConnection("jdbc:esproc:local://");

    //调用esProc程序(存储过程),其中test是dfx的文件名

    com.esproc.jdbc.InternalCStatementst =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test(?)");

    //设置参数

    st.setObject(1,"ORDERDATE>=date(2010,1,1) && SELLERID==18 || CLIENT==\"PWQ\"");//执行esProc存储过程

    ResultSet set =st.executeQuery();

    对于代码较简单的脚本,还可以把代码直接写在调用集算器JDBC的Java程序中,而不必专门编写脚本文件(test.dfx):

    ResultSet set = st.executeQuery(

    "=file(\"D:/file/orders.xls\").importxls@t().select(ORDERDATE>=date(2010,1,1) && SELLERID==18 || CLIENT==\"PWQ\")");

    这段Java代码直接调用了集算器的一句脚本:从Excel文件中取得数据,并按照指定的条件过滤。

  • ?

    Java使用Apache POI导出Excel

    郦幻莲

    展开

    一.POI简单介绍

    Apache POI 是用Java 编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对 Microsoft Office 格式档案读和写的功能

    HSSF 提供读写Microsoft Excel XLS格式档案的功能。

    XSSF 提供读写Microsoft Excel OOXML XLSX格式档案的功能。

    HWPF 提供读写Microsoft Word DOC格式档案的功能。

    HSLF 提供读写Microsoft PowerPoint格式档案的功能。

    HDGF 提供读Microsoft Visio格式档案的功能。

    HPBF 提供读Microsoft Publisher格式档案的功能。

    HSMF 提供读Microsoft Outlook格式档案的功能。

    二.操作步骤

    1.环境配置:导入jar包

    org.apache.poi poi 3.16

    2.创建一个Excel工作簿

    @Test public void test() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel工作蒲.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }

    3.创建一个sheet页

    @Test public void sheet() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 wb.createSheet("第一个sheet页"); wb.createSheet("第二个sheet页"); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel工作蒲带有sheet页.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }

    sheet页

    4.创建行和列

    @Test public void row() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("学生信息sheet页"); //创建一行 Row row = sheet.createRow(0); //创建一个单元格 Cell cell =null; for(int i = 0 ;i<5;i++){ row.createCell(i).setCellValue("写入信息:单元格内容"+i); } //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel学生信息.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }

    5.创建一个时间样式到Excel

    @Test public void date() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("时间sheet页"); //创建一行 Row row = sheet.createRow(0); //创建一个单元格 Cell cell = row.createCell(0); cell.setCellValue(new Date()); CreationHelper creationHelper = wb.getCreationHelper(); //设置单元格样式 CellStyle cellStyle = wb.createCellStyle(); cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("YYYY-MM-DD hh:mm:ss")); cell = row.createCell(1); cell.setCellValue(new Date()); //设置日期样式 cell.setCellStyle(cellStyle); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel日期格式.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }

    6.单元格对其方式及行高

    @Test public void style() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("第一个sheet"); //创建一行 Row row = sheet.createRow(0); //设置行高 row.setHeightInPoints(30); //创建一个单元格 createCell(wb,row,(short)0,HSSFCellStyle.ALIGN_CENTER,HSSFCellStyle.VERTICAL_BOTTOM); createCell(wb,row,(short)1,HSSFCellStyle.ALIGN_JUSTIFY,HSSFCellStyle.VERTICAL_CENTER); createCell(wb,row,(short)2,HSSFCellStyle.ALIGN_CENTER_SELECTION,HSSFCellStyle.VERTICAL_JUSTIFY); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel样式.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); } /** * 创建一个单元格设置对应的对其方式 * @param workbook 工作蒲 * @param row 行 * @param column 列 */ private static void createCell(Workbook workbook, Row row, short column,short halign,short valign){ Cell cell = row.createCell(column);//创建单元格 cell.setCellValue(new HSSFRichTextString("我是富文本"));//设置值 CellStyle cellStyle = workbook.createCellStyle();//创建样式 cellStyle.setAlignment(halign);//设置单元格水平方向对其方式 cellStyle.setVerticalAlignment(valign);//设置单元格垂直方向对其方式 cell.setCellStyle(cellStyle); }

    合并单元格

    @Test public void test1() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("第一个sheet"); //创建一行 Row row = sheet.createRow(1); //设置行高 row.setHeightInPoints(30); //创建一个单元格 Cell cell = row.createCell(1); cell.setCellValue("合并单元格"); //合并单元格(起始行,结束行,起始列,结束列) sheet.addMergedRegion(new CellRangeAddress(1,2,1,2)); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel样式.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }

  • ?

    JavaEE——Java导出Excel表

    乐松

    展开

    声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。

    Java导出Excel表

    首先去maven里面下载 upload 1.3.3 版本 下载到你的maven工程里面

    上传文件必须是post方法

    上传文件同时有表单值的话 你用request.getParame是获得不到的

    Java导出Excel表

    去maven工厂下载 POI jar包

  • ?

    SpreadJS ExcelIO实现服务器端Excel导入导出

    粱渊思

    展开

    SpreadJS在V10版本后推出了纯前端的Excel导入导出,这个功能可以很方便的实现客户端的Excel导入导出,但是如果用户需要导入导出到浏览器端又该怎么办呢?其实纯前端的Excel导入导出同样可以实现服务器端的Excel导入导出。下面让我们来看一下是如何实现的:

    本示例的后端使用JAVA语言,通过SpreadJS的前端导出导出与JAVA后端结合,实现分从服务器端导入Excel与导出Excel保存至服务器端这两个功能:

    从服务器端导入Excel:

    这部分使用纯前端实现,纯前端实现有一个弊端就是,浏览器没有权限访问服务器上工程目录以外的路径,所以需要将服务器端的Excel放入工程目录下。然后下载到前端直接打开,核心代码如下:

    导出Excel保存至服务器端:

    这部分使用前端导出功能与后端java结合的方式来实现,首先通过前端Excel导出,生成导出文件,然后通过formdata来承载导出文件,之后通过ajax将formdata传至后端java。后端java使用文件操作将文件保存至服务器端。

    这里有以下需要注意的地方:

    formdata没有办法改变enctype,而我们需要的用entype为multipart/form-data类型的form来承载导出文件。这里需要在jsp页面上创建一个空的form,并将其entype设置为multipart/form-data:

    之后js中只需要初始化一个该form的formdata实例即可:

    var fd = new FormData(document.forms.namedItem("myform"));

    以上就是核心的部分代码以及原理。

    了解更多

    SpreadJS是 Spread 表格开发系列产品之一。该产品是葡萄城公司出品的一系列功能和 Excel 类似的表格工具,支持桌面、Web 和移动平台开发,用于在应用系统中实现 Excel 导入导出、表格数据录入和编辑等交互功能,并提供灵活的定制能力和丰富的数据可视化效果。

    Spread 是目前市面上最接近 Excel 的表格开发工具,无论是界面、函数还是布局,都与 Excel 高度接近,正被华为、东软、中国平安、河海大学、中通快递、普华永道、魔方网表、思源软件等企业应用于项目开发中。

    除了纯前端的SpreadJS,该系列产品还包括 .NET 平台可用的Spread Studio,和服务器端批量操作Excel的Spread表格组件,敬请登陆官网了解更多:http://gcpowertools/

    关于葡萄城

    葡萄城成立于1980年,是全球最大的控件提供商,世界领先的企业应用定制工具、企业报表和商业智能解决方案提供商,为超过75%的全球财富500强企业提供服务。葡萄城于1988年在中国设立研发中心,在全球化产品的研发过程中,不断适应中国市场的本地需求,并为软件企业和各行业的信息化提供优秀的软件工具和咨询服务。

  • ?

    Java实现文件批量导入导出实例(兼容xls,xlsx)

    于芮

    展开

    1、介绍

    java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下。

    目前我所接触过的导入导出技术主要有POI和iReport,poi主要作为一些数据批量导入数据库,iReport做报表导出。另外还有jxl类似poi的方式,不过貌似很久没跟新了,2007之后的office好像也不支持,这里就不说了。

    2、POI使用详解

    2.1 什么是Apache POI?

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    2.2 POI的jar包导入

    本次讲解使用maven工程,jar包版本使用poi-3.14和poi-ooxml-3.14。目前最新的版本是3.16。因为3.15以后相关api有更新,部分操作可能不一样,大家注意下。

    2.3 POI的API讲解

    2.3.1 结构

    HSSF - 提供读写Microsoft Excel格式档案的功能。XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能。

    2.3.2 对象

    本文主要介绍HSSF和XSSF两种组件,简单的讲HSSF用来操作Office 2007版本前excel.xls文件,XSSF用来操作Office 2007版本后的excel.xlsx文件,注意二者的后缀是不一样的。

    HSSF在org.apache.poi.hssf.usermodel包中。它实现了Workbook 接口,用于Excel文件中的.xls格式

    常用组件:HSSFWorkbook excel的文档对象HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾(只有打印的时候才能看到效果)样式:HSSFCellStyle cell样式辅助操作包括:HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表

    XSSF在org.apache.xssf.usemodel包,并实现Workbook接口,用于Excel文件中的.xlsx格式

    常用组件:XSSFWorkbook excel的文档对象XSSFSheet excel的表单XSSFRow excel的行XSSFCell excel的格子单元XSSFFont excel字体XSSFDataFormat 日期格式和HSSF类似;

    2.3.3 两个组件共同的字段类型描述

    其实两个组件就是针对excel的两种格式,大部分的操作都是相同的。

    2.3.4 操作步骤

    以HSSF为例,XSSF操作相同。

    首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。

    3、代码操作

    3.1 效果图

    惯例,贴代码前先看效果图

    Excel文件两种格式各一个:

    代码结构:

    导入后:(我导入了两遍,没做校验)

    导出效果:

    3.2 代码详解

    这里我以Spring+SpringMVC+Mybatis为基础

    Controller:

    Service

    3.3 导出文件api补充

    大家可以看到上面service的代码只是最基本的导出。

    在实际应用中导出的Excel文件往往需要阅读和打印的,这就需要对输出的Excel文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。

    3.3.1 单元格合并

    使用HSSFSheet的addMergedRegion()方法

    参数CellRangeAddress 表示合并的区域,构造方法如下:依次表示起始行,截至行,起始列, 截至列

    3.3.2 设置单元格的行高和列宽

    3.3.3 设置单元格样式

    1、创建HSSFCellStyle

    2、设置样式

    3、将样式应用于单元格

    3.3.4设置字体样式

    1、创建HSSFFont对象(调用HSSFWorkbook 的createFont方法)

    2、设置字体各种样式

    3、将字体设置到单元格样式

    大家可以看出用poi导出文件还是比较麻烦的,等下次在为大家介绍下irport的方法。

    导出的api基本上就是这些,最后也希望上文对大家能有所帮助。

    学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群495273252,我们一起学Java!

  • ?

    一行代码完成Java的Excel读写

    Zhen

    展开

    前段时间在 github 上发现了阿里的 EasyExcel 项目,觉得挺不错的,就写了一个简单的方法封装,做到只用一个函数就完成 Excel 的导入或者导。刚好前段时间更新修复了一些 BUG,就把我的这个封装分享出来,请多多指教。

    附上源码:

    https://github/HowieYuan/easyexcel-method-encapsulation

    EasyExcel

    EasyExcel 的 github 地址:

    https://github/alibaba/easyexcel

    EasyExcel 的官方介绍:

    可以看到 EasyExcel 最大的特点就是使用内存少,当然现在它的功能还比较简单,能够面对的复杂场景比较少,不过基本的读写完全可以满足。

    一. 依赖

    首先是添加该项目的依赖,目前的版本是 1.0.2。

    com.alibabaeasyexcel1.0.2

    二. 需要的类

    1. ExcelUtil

    工具类,可以直接调用该工具类的方法完成 Excel 的读或者写。

    2. ExcelListener

    监听类,可以根据需要与自己的情况,自定义处理获取到的数据,我这里只是简单地把数据添加到一个 List 里面。

    publicclassExcelListenerextendsAnalysisEventListener {//自定义用于暂时存储data。//可以通过实例获取该值private List datas = new ArrayList<>();/** * 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据 */ @Overridepublicvoidinvoke(Object object, AnalysisContext context) {//数据存储到list,供批量处理,或后续自己业务逻辑处理。 datas.add(object);//根据自己业务做处理 doSomething(object); }privatevoiddoSomething(Object object) { } @OverridepublicvoiddoAfterAllAnalysed(AnalysisContext context) { }public List getDatas() {return datas; }publicvoidsetDatas(List datas) {this.datas = datas; }}

    3. ExcelWriterFactroy

    用于导出多个 sheet 的 Excel,通过多次调用 write 方法写入多个 sheet。

    4. ExcelException

    捕获相关 Exception。

    三. 读取 Excel

    读取 Excel 时只需要调用 ExcelUtil.readExcel() 方法:

    @RequestMapping(value = "readExcel", method = RequestMethod.POST)public Object readExcel(MultipartFile excel) {return ExcelUtil.readExcel(excel, new ImportInfo());}

    其中 excel 是 MultipartFile 类型的文件对象,而 new ImportInfo() 是该 Excel 所映射的实体对象,需要继承 BaseRowModel 类,如:

    publicclass ImportInfo extends BaseRowModel {@ExcelProperty(index = 0)privateString name;@ExcelProperty(index = 1)privateString age;@ExcelProperty(index = 2)privateString email;publicString getName() {return name; }publicvoid setName(String name) {this.name = name; }publicString getAge() {return age; }publicvoid setAge(String age) {this.age = age; }publicString getEmail() {return email; }publicvoid setEmail(String email) {this.email = email; }}

    作为映射实体类,通过 @ExcelProperty 注解与 index 变量可以标注成员变量所映射的列,同时不可缺少 setter 方法。

    四. 导出 Excel

    1. 导出的 Excel 只拥有一个 sheet

    只需要调用 ExcelUtil.writeExcelWithSheets() 方法:

    @RequestMapping(value = "writeExcel", method = RequestMethod.GET)publicvoidwriteExcel(HttpServletResponse response) throws IOException { List list = getList(); String fileName = "一个 Excel 文件"; String sheetName = "第一个 sheet"; ExcelUtil.writeExcel(response, list, fileName, sheetName, new ExportInfo()); }

    fileName,sheetName 分别是导出文件的文件名和 sheet 名,new ExportInfo() 为导出数据的映射实体对象,list 为导出数据。

    对于映射实体类,可以根据需要通过 @ExcelProperty 注解自定义表头,当然同样需要继承 BaseRowModel 类,如:

    publicclass ExportInfo extends BaseRowModel {@ExcelProperty(value = "姓名" ,index = 0)privateString name;@ExcelProperty(value = "年龄",index = 1)privateString age;@ExcelProperty(value = "邮箱",index = 2)privateString email;@ExcelProperty(value = "地址",index = 3)privateString address;}

    value 为列名,index 为列的序号。

    如果需要复杂一点,可以实现如下图的效果:

    对应的实体类写法如下:

    publicclass MultiLineHeadExcelModel extends BaseRowModel {@ExcelProperty(value = {"表头1","表头1","表头31"},index = 0)privateString p1;@ExcelProperty(value = {"表头1","表头1","表头32"},index = 1)privateString p2;@ExcelProperty(value = {"表头3","表头3","表头3"},index = 2)private int p3;@ExcelProperty(value = {"表头4","表头4","表头4"},index = 3)private long p4;@ExcelProperty(value = {"表头5","表头51","表头52"},index = 4)privateString p5;@ExcelProperty(value = {"表头6","表头61","表头611"},index = 5)privateString p6;@ExcelProperty(value = {"表头6","表头61","表头612"},index = 6)privateString p7;@ExcelProperty(value = {"表头6","表头62","表头621"},index = 7)privateString p8;@ExcelProperty(value = {"表头6","表头62","表头622"},index = 8)privateString p9;}

    2. 导出的 Excel 拥有多个 sheet

    调用 ExcelUtil.writeExcelWithSheets() 处理第一个 sheet,之后调用 write() 方法依次处理之后的 sheet,最后使用 finish() 方法结束。

    publicvoidwriteExcelWithSheets(HttpServletResponse response) throws IOException { List list = getList(); String fileName = "一个 Excel 文件"; String sheetName1 = "第一个 sheet"; String sheetName2 = "第二个 sheet"; String sheetName3 = "第三个 sheet"; ExcelUtil.writeExcelWithSheets(response, list, fileName, sheetName1, new ExportInfo()) .write(list, sheetName2, new ExportInfo()) .write(list, sheetName3, new ExportInfo()) .finish();}

    write 方法的参数为当前 sheet 的 list 数据,当前 sheet 名以及对应的映射类。

    扩展阅读

    代码整洁之道|最佳实践小结

    Javascript 将 HTML 页面生成 PDF 并下载

    Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框

    来源:https://juejin.im/post/5ba320546fb9a05d0b14304b

    文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除

  • ?

    整理关于java写入内容到excel的例子供大家参考

    罗依丝

    展开

    1POI jar简介

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

    2POI jar下载

    poi下载地址:https://apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.tar.gz

    下载之后把压缩包解压,然后在项目里面引用解压文件夹里面的jar

    3新建ReadExcelTest java project,引入poi相关jar

    4创建一个WriteExcel java类,编写代码,写入excel里面

    package test;

    import java.io.File;

    import java.io.FileInputStream;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.OutputStream;

    import java.util.ArrayList;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import org.apache.poi.hssf.usermodel.HSSFWorkbook;

    import org.apache.poi.ss.usermodel.Cell;

    import org.apache.poi.ss.usermodel.Row;

    import org.apache.poi.ss.usermodel.Sheet;

    import org.apache.poi.ss.usermodel.Workbook;

    import org.apache.poi.xssf.usermodel.XSSFWorkbook;

    public class WriteExcel {

    private static final String EXCEL_XLS = "xls";

    private static final String EXCEL_XLSX = "xlsx";

    @SuppressWarnings("rawtypes")

    public static void writeExcel(List> dataList, int cloumnCount,

    String finalXlsxPath) {

    OutputStream out = null;

    try {

    // 获取总列数

    int columnNumCount = cloumnCount;

    // 读取Excel文档

    File finalXlsxFile = new File(finalXlsxPath);

    Workbook workBook = getWorkbok(finalXlsxFile);

    // sheet 对应一个工作页

    Sheet sheet = workBook.getSheetAt(0);

    /**

    * 删除原有数据,除了属性列

    */

    int rowNumber = sheet.getLastRowNum(); // 第一行从0开始算

    System.out.println("原始数据总行数,除属性列:" + rowNumber);

    for (int i = 1; i <= rowNumber; i++) {

    Row row = sheet.getRow(i);

    sheet.removeRow(row);

    }

    // 创建文件输出流,输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效

    out = new FileOutputStream(finalXlsxPath);

    workBook.write(out);

    * 往Excel中写新数据

    for (int j = 0; j < dataList.size(); j++) {

    // 创建一行:从第二行开始,跳过属性列

    Row row = sheet.createRow(j + 1);

    // 得到要插入的每一条记录

    Map dataMap = dataList.get(j);

    String name = dataMap.get("title_id").toString();

    String address = dataMap.get("title_name").toString();

    String phone = dataMap.get("title_name_en").toString();

    for (int k = 0; k <= columnNumCount; k++) {

    // 在一行内循环

    Cell first = row.createCell(0);

    first.setCellValue(name);

    Cell second = row.createCell(1);

    second.setCellValue(address);

    Cell third = row.createCell(2);

    third.setCellValue(phone);

    // 创建文件输出流,准备输出电子表格:这个必须有,否则你在sheet上做的任何操作都不会有效

    } catch (Exception e) {

    e.printStackTrace();

    } finally {

    if (out != null) {

    out.flush();

    out.close();

    } catch (IOException e) {

    System.out.println("数据汇入成功");

    * 判断Excel的版本,获取Workbook

    *

    * @param in

    * @param filename

    * @return

    * @throws IOException

    public static Workbook getWorkbok(File file) throws IOException {

    Workbook wb = null;

    FileInputStream in = new FileInputStream(file);

    if (file.getName().endsWith(EXCEL_XLS)) { // Excel 2003

    wb = new HSSFWorkbook(in);

    } else if (file.getName().endsWith(EXCEL_XLSX)) { // Excel 2007/2010

    wb = new XSSFWorkbook(in);

    return wb;

    * @param args

    public static void main(String[] args) {

    List> mapList = new ArrayList>();

    for(int k=0; k<100;k++){

    Map map = new HashMap();

    map.put("title_id", "title_id"+k);

    map.put("title_name", "title_name"+k);

    map.put("title_name_en", "title_name_en"+k);

    mapList.add(map);

    writeExcel(mapList, mapList.size(), "D:/360bizhi/readExcel.xlsx");

    5运行main进行测试,查看写入结果

    写入结果和预期是一样的,说明写入成功

    请大家多多关注我的头条号,谢谢大家

  • java上传excel