package com.hd.erpreport.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import com.hd.erpreport.utils.ExportDownLoadUtil; @Controller
@RequestMapping("SalesExportHJController/")
public class SalesExportHJController { @RequestMapping("exportSales.do")
public void exportSales(HttpServletRequest req,HttpServletResponse res){
String begin = req.getParameter("begin");//2018-08-01
String end = req.getParameter("end");
// System.out.println("begin = " + begin);
// System.out.println("end = " + end);
//得到两个日期之间总的月数
// int totalMonth = (getYearAndMonth(end)-getYearAndMonth(begin))/100 * 12 + (getYearAndMonth(end)-getYearAndMonth(begin)) % 100 ;
int beginYear = getYearFourI(begin);//开始的年
int endYear = getYearFourI(end);//结束的年
int beginMonth = getMonthI(begin);
int endMonth = getMonthI(end); String[] titles = { "销售订单号", "订单日期", "订单项次", "销售物料号", "品名", "规格型号",
"关联品号", "销售数量", "交货日", "采购/生产单号", "采购单项次","工作中心", "物料号",
"物料品名", "规格型号", "件号", "采购/生产数量", "已领料数量", "已完成数量", "计划开始日期",
"实际开始日期", "计划完成日期","实际完成日期", "延期开始天数", "延期完成天数", "状态",
"库存数量", "序列号" };
String[] resultTitles = { "DDH","DDRQ","DDXC","XSWLH","XSWLPM","XSWLGG","XSWLJH","XSSL","JHR","CGGDDH","CGXC","GZZX",
"WLH","WLPM","GGXH","JH","CGSCSL","YWCSL","JHKSRQ","JHWCRQ","SJKSRQ","SJWCRQ","YQKSTS","YQWCTS",
"YLLSL","ZT","KCSL","XLHHZ"};
// 连接数据库
Connection conn = null;
PreparedStatement ps = null;
ResultSet result = null;
FileOutputStream fout = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");// 加载驱动,不同的数据库不同
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.2:1521:topprod", "hdzsq", "hdzsq");// 建立连接
conn.setAutoCommit(false);// 禁止自动提交,设置回滚点 // 1、生成一个包含相应月数的工作簿
String sheetName;
// int month = getMonthI();
SXSSFWorkbook wb = new SXSSFWorkbook (1024);// 创建工作簿
for (int k = beginYear; k <= endYear; k++) {
while(true){
//如果不到12
if (k >= endYear && beginMonth > endMonth) {
break;
}
sheetName = getSheetName(k,beginMonth);// 2018年1月-2018年11月
Sheet sheet = wb.createSheet(sheetName);// 创建mouth个sheet并返回
// sheet写对应的内容
Row row = sheet.createRow(0);// 创建第一行
for (int j = 0; j < 28; j++) {
row.createCell(j).setCellValue(titles[j]);
}
String sql_sel = "select * from ddzt_v where ddh like 'SOD1-HD" + k%100 + StringUtils.leftPad(beginMonth+"", 2,"0") + "%'";
ps = conn.prepareStatement(sql_sel);
result = ps.executeQuery();
int l = 1;
while (result.next()) {
// 把得到的数据写到Excel中
row = sheet.createRow(l++);
for (int j = 0; j < 28; j++) {
row.createCell(j).setCellValue(result.getString(resultTitles[j]));
}
}
//如果处理的月份是12月,跳出当前循环,外层从1开始循环,否则月份加1
if (beginMonth % 12 == 0) {
beginMonth = 1;
break;
} beginMonth++ ;
}
} /*for (int i = 1; i <= month; i++) {
sheetName = getSheetName(i);// 2018年1月-2018年11月
Sheet sheet = wb.createSheet(sheetName);// 创建mouth个sheet并返回
// sheet写对应的内容
Row row = sheet.createRow(0);// 创建第一行
for (int j = 0; j < 28; j++) {
row.createCell(j).setCellValue(titles[j]);
}
String sql_sel = "select * from ddzt_v where ddh like 'SOD1-HD18" + StringUtils.leftPad(i+"", 2,"0") + "%'";
ps = conn.prepareStatement(sql_sel);
result = ps.executeQuery();
int k = 1;
while (result.next()) {
// 把得到的数据写到Excel中
row = sheet.createRow(k++);
for (int j = 0; j < 28; j++) {
row.createCell(j).setCellValue(result.getString(resultTitles[j]));
}
}
}*/
String fileName = "/销售订单状态导出.xlsx";
String path = new File(req.getSession().getServletContext().getRealPath("/")) + fileName;
// 文件的输出路径
fout = new FileOutputStream(path);
wb.write(fout);
fout.close();
wb.dispose();
//把生成的文件下载下来
File file = new File(req.getSession().getServletContext().getRealPath(fileName));
ExportDownLoadUtil.resDownload(res,file); } catch (Exception e) {
e.printStackTrace();
} }
//year = 2018-01-02
public static String getYearFourByStr(String year){
return year.substring(0,4);//
}
public static String getYearTwoByStr(String year){
return year.substring(2,4);//
}
public static String getMonthByStr(String year){
return year.substring(5,7);//
}
public static int getYearAndMonth(String year){
return Integer.parseInt(year.substring(0,4)+year.substring(5,7));//
}
public static int getYearFourI(String year){
return Integer.parseInt(getYearFourByStr(year));//得到整形的年
}
public static int getMonthI(String year){
return Integer.parseInt(getMonthByStr(year));//得到整形的月
}
public static String getSheetName(int year,int month){
return year + "年" + month + "月";
} }

POI大数据Excel生成的更多相关文章

  1. [转]POI大数据量Excel解决方案

    全文转载自:jinshuaiwang的博客 目前处理Excel的开源javaAPI主要有两种,一是Jxl(Java Excel API),Jxl只支持Excel2003以下的版本.另外一种是Apach ...

  2. POI 海量数据/大数据文件生成SXSSFWorkbook使用简介

    在之前我们知道处理xls的excel用的workbook是HSSFWorkbook,处理xlsx的excel用的是XSSFWorkbook. 上面两个类导出excel的时候数据会驻留在内存中,所以当数 ...

  3. poi大数据将excel2007导入数据库

    package com.jeeframe.cms.updata.service.impl; import java.io.IOException; import java.io.InputStream ...

  4. 在AcGIS随着大数据的生成DEM

    在ArcGIS产生DEM时间.数据来源是经常有的高程点.轮廓线,该高程点.等高线密集,可能有几千万.甚至亿高程点.轮廓线. 如果您使用这些矢量数据生成TIN.不能实现的,由于生成TIN时,支持的最大结 ...

  5. java利用poi包 为excel生成超链接

    转载自:http://www.blogjava.net/leekiang/archive/2008/10/21/235794.html   1,一个需求, 要求报表生成的Excel表格支持超链接.例如 ...

  6. poi大数据导入解决方法

    This one comes up quite a lot, but often the reason isn't what you might initially think. So, the fi ...

  7. 大数据Excel导出方案

    static void Main(string[] args) { Excel.Application app = new Excel.Application(); Excel._Workbook r ...

  8. POI 生成excel(大数据量) SXSSF

    使用POI 的SXSSF (Streaming Usermodel API)生成较大的excel,同时开启压缩 import junit.framework.Assert; import org.ap ...

  9. POI读写大数据量excel,解决超过几万行而导致内存溢出的问题

    1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384 ...

随机推荐

  1. Criteo电面二

    是第二次Video电面.本来约的是个俄罗斯人,结果面试时才发现换了一位国人大哥.面试这么久,还是第一次遇到国人,然后就被放水了,真给力! 第二天通知约onsite,查了地图,公司就在斯坦福对面.希望能 ...

  2. go语言调用append之后是否重新分配内存?

    查看tidb源代码:::util/charset/charset.go,下面有段代码: // GetAllCharsets gets all charset descriptions in the l ...

  3. 关于Retrofit网络请求URL中含有可变参数的处理

    开题:在此默认各位看官对Retrofit.以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,今天我们谈在Retrofit请求接口管理类中URL参数含有动态参数的处理方式.一般我 ...

  4. Java中Comparable和Comparator区别

    很好的一篇博客:http://blog.csdn.net/jq_ak47/article/details/61203817 http://www.cnblogs.com/cmxwt/p/6215253 ...

  5. springboot-aop

    AOP(面向切面编程)是Spring的两大核心功能之一,功能非常强大,为解耦提供了非常优秀的解决方案. 现在就以springboot中aop的使用来了解一下如何使用aop. 写几个简单的Spring ...

  6. Windows上使用telnet测试端口号

    之前测试服务器某一端口开启开启情况一般在服务器上使用  netstat –ano|findstr "端口号"命令查看. 但是有时候端口在服务器上开通了,但是客户端并不一定可以访问到 ...

  7. php四个常用类封装

    这4个类分别是Mysql类. 分页类.缩略图类.上传类. Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = nul ...

  8. Ext-JS-Modern-Demo 面向移动端示例

    基于Ext Js 6.5.2 面向移动端示例,低于此版本可能存在兼容问题,慎用 已忽略编译目录,请自行编译运行 Sencha Cmd 版本:v6.5.2.15 git地址:https://github ...

  9. 接口自动化测试 (三)request.post

    上一节介绍了  requests.get()  方法的基本使用,本节介绍  requests.post()  方法的使用: 本文目录: 一.方法定义 二.post方法简单使用 1.带数据的post 2 ...

  10. 10、DOM(文档对象模型)

    1.认识DOM html    骨架 css     装修 javascript 物业 ==DOM 打破上述三者的通道.== [注]script标签一般情况下要写在head标签. <div id ...