package com.senlany.service.impl.k3;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.senlany.comm.ConnUtil;
import com.senlany.mapper.k3.FinancialReportMapper;
/**
* @author Amos E-mail : zhangxiaopeng@wlspjt.com
* @version 创建时间:2015年5月28日 下午2:36:37
* @description
* 因程序未按照标准java程序结构创建
* 现将程序逻辑放在service中
*/
@Service
public class FinancialReportService {
private static Log log = LogFactory.getLog(FinancialReportService.class);
@Autowired
private FinancialReportMapper financialReportMapper;
/**
* @param map
* @return
*/
public List<Map> getList(Map map){
return financialReportMapper.getList(map);
}
/**
* 导出财务报表
* @param begindate
* @param enddate
*/
public void exportExcel(HttpServletRequest request, HttpServletResponse response){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
conn = ConnUtil.getConn();
WritableWorkbook workbook = null;
WritableSheet sheet = null;
Label label = null;
Label label0 = null;
try {
/**
* 此程序块必须放在此处执行
* 因此处调用函数中有批量更新操作
*/
conn.setAutoCommit(false);
st = (Statement) conn.createStatement();
st.addBatch("dbo.WL_F_MAIN");
st.executeBatch();
conn.commit();
//查询全局临时表
CallableStatement cs = conn.prepareCall("SELECT * FROM ##financial_report_table");
rs = cs.executeQuery();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 创建Excel表
try {
/**
* 将工作薄输出至前台文件输出流
*/
String contentType = "application/vnd.ms-excel";
response.reset();
response.setContentType(contentType);
response.setHeader("Content-Disposition", "attachment; filename=\"" + new String("休闲营销财务报表.xls".getBytes("gb2312"), "ISO8859-1") + "\"");
OutputStream out = response.getOutputStream();
workbook = Workbook.createWorkbook(out);
// 创建Excel表中的sheet
sheet = workbook.createSheet("First Sheet", 0);
// 向Excel中添加数据
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String colName = null;
int row = 2;
int income_count = 0;//收入计数
int inc_cat_xxd_ct = 0;//收入_休闲豆计数
int inc_cat_rsb_ct = 0;//收入_肉松饼计数
int inc_cat_dxm_ct = 0;//收入_点心面计数
int gift_count = 0;//搭赠计数
int gif_cat_xxd_ct = 0;//搭赠_休闲豆计数
int gif_cat_rsb_ct = 0;//搭赠_肉松饼计数
int gif_cat_dxm_ct = 0;//搭赠_点心面计数
int fee_count = 0;//运费计数
// 添加标题
for (int i = 0; i < columnCount; i++) {
colName = rsmd.getColumnName(i + 1);
if("FCustID".equals(colName)){
colName = "客户编号";
label = new Label(i, 0, colName);
}else if("BIGAREA".equals(colName)){
colName = "大区";
label = new Label(i, 0, colName);
}else if("AREAMANAGER".equals(colName)){
colName = "大区经理";
label = new Label(i, 0, colName);
}else if("PROVINCE".equals(colName)){
colName = "省区";
label = new Label(i, 0, colName);
}else if("PROVINCEMANAGER".equals(colName)){
colName = "省区经理";
label = new Label(i,0, colName);
}else if("CLIENT".equals(colName)){
colName = "客户";
label = new Label(i,0, colName);
}else if("SALESMAN".equals(colName)){
colName = "业务员";
label = new Label(i,0, colName);
} else if("DATE".equals(colName)){
colName = "日期";
label = new Label(i, 0, colName);
}else{
if(colName.contains("QUANTITY")){
label = new Label(i, row+1, "数量");
sheet.addCell(label);
}else if(colName.contains("PRICE")){
label = new Label(i, row+1, "单价");
sheet.addCell(label);
}else if(colName.contains("AMOUNT")){
label = new Label(i, row+1, "金额");
sheet.addCell(label);
}
label = new Label(i, row, colName);
}
if(colName.endsWith("0")){
income_count++;
if(colName.startsWith("xxd")){
inc_cat_xxd_ct ++;
}else if(colName.startsWith("rsb")){
inc_cat_rsb_ct ++;
}else{
inc_cat_dxm_ct ++;
}
}else if(colName.endsWith("1")){
gift_count++;
if(colName.startsWith("xxd")){
gif_cat_xxd_ct ++;
}else if(colName.startsWith("rsb")){
gif_cat_rsb_ct ++;
}else{
gif_cat_dxm_ct ++;
}
}else if(colName.endsWith("3")){
fee_count++;
}
log.debug("标题:"+i+"---"+row +"---"+ colName);
sheet.addCell(label);
}
/**
* 单元格合并各参数含义
* mergeCells(startColNum, startRowNum, endColNum, endRowNum);
*/
sheet.mergeCells(0, 0, 0, 3);
sheet.mergeCells(1, 0, 0, 3);
sheet.mergeCells(2, 0, 0, 3);
sheet.mergeCells(3, 0, 0, 3);
sheet.mergeCells(4, 0, 0, 3);
sheet.mergeCells(5 ,0, 0, 3);
sheet.mergeCells(6, 0, 0, 3);
sheet.mergeCells(7, 0, 0, 3);
sheet.mergeCells(8, 0,7+income_count, 0);
label = new Label(8, 0, "销售收入");
sheet.addCell(label);
sheet.mergeCells(8, 1,7+inc_cat_xxd_ct,1);
label = new Label(8,1, "休闲豆");
sheet.addCell(label);
sheet.mergeCells(8+inc_cat_xxd_ct, 1,7+inc_cat_xxd_ct+inc_cat_rsb_ct,1);
label = new Label(8+inc_cat_xxd_ct, 1, "肉松饼");
sheet.addCell(label);
sheet.mergeCells(8+inc_cat_xxd_ct+inc_cat_rsb_ct, 1,7+inc_cat_xxd_ct+inc_cat_rsb_ct+inc_cat_dxm_ct,1);
label = new Label(8+inc_cat_xxd_ct+inc_cat_rsb_ct, 1, "点心面");
sheet.addCell(label);
sheet.mergeCells(8+income_count, 0,7+income_count+gift_count,0);
label = new Label(8+income_count, 0, "搭赠");
sheet.addCell(label);
sheet.mergeCells(8+income_count, 1,7+income_count+gif_cat_xxd_ct, 1);
label = new Label(8+income_count, 1, "休闲豆");
sheet.addCell(label);
sheet.mergeCells(8+income_count+gif_cat_xxd_ct, 1,7+income_count+gif_cat_xxd_ct+gif_cat_rsb_ct,1);
label = new Label(8+income_count+gif_cat_xxd_ct, 1, "肉松饼");
sheet.addCell(label);
sheet.mergeCells(8+income_count+gif_cat_xxd_ct+gif_cat_rsb_ct, 1,7+income_count+gif_cat_xxd_ct+gif_cat_rsb_ct+gif_cat_dxm_ct,1);
label = new Label(8+income_count+gif_cat_xxd_ct+gif_cat_rsb_ct, 1, "点心面");
sheet.addCell(label);
sheet.mergeCells(8+income_count+gift_count, 0,7+income_count+gift_count+fee_count,0);
label = new Label(8+income_count+gift_count, 0, "运费");
sheet.addCell(label);
row += 2;
// row ++;
log.debug("写入标题成功");
while (rs.next()) {
for (int i = 0; i < columnCount; i++) {
label = new Label(i, row, rs.getString(i + 1));
log.debug("行:"+i+"---"+row +"---"+ rs.getString(i+1));
sheet.addCell(label);
}
row++;
}
log.debug("写入内容成功");
// 关闭文件
workbook.write();
workbook.close();
log.info("数据成功写入Excel");
} catch (SQLException e) {
log.debug(e.getMessage());
} catch (RowsExceededException e) {
log.debug(e.getMessage());
} catch (WriteException e) {
log.debug(e.getMessage());
} catch (IOException e) {
log.debug(e.getMessage());
} finally {
try {
workbook.close();
//删除全局临时表
st = (Statement) conn.createStatement();
st.addBatch("if object_id('tempdb..##financial_report_table') is not null DROP TABLE ##financial_report_table;");
st.executeBatch();
conn.commit();
//释放数据库相关链接
ConnUtil.free(null, st, conn);
} catch (Exception e) {
log.debug(e.getMessage());
}
}
}
}
- 浏览: 23660 次
- 来自: 杭州
文章分类
最新评论
发表评论
-
获取sqlserver数据库中临时表的方法
2015-06-02 11:20 863select name from tempdb.sys.col ... -
with as 及 update
2015-04-23 17:38 1268with a as(select a.EmplID, a.Wo ... -
java读写text 典例
2014-03-31 18:27 697import java.io.BufferedReader; ... -
JVM加载class文件的原理 (转)
2013-09-06 13:30 396当Java编译器编译好.class文件之后,我们需 ... -
Java dom4j api 使用集合 (转)
2013-09-06 13:25 642SAXReader reader = new SAXReade ... -
Apache POI HSSFWorkbook 操作excel
2013-07-18 13:46 1170public String exportFunctionAct ...
相关推荐
Java 调用 SQL Server 存储过程是指在 Java 应用程序中调用 SQL Server 数据库中的存储过程,以实现数据的增删改查等操作。下面是关于 Java 调用 SQL Server 存储过程的知识点: 1. 创建存储过程 在 SQL Server 中...
本篇文章详细介绍了如何通过Java调用SQL Server存储过程,涵盖了几种不同类型的存储过程调用方式。 1. 使用不带参数的存储过程 对于不带参数的存储过程,我们可以通过`Statement`对象的`executeQuery`方法,配合`{...
在Java编程环境中,如Eclipse 3.3,与数据库进行交互是常见的需求,而调用SQL Server存储过程是其中一种高效的操作方式。存储过程是预编译的SQL语句集合,可以封装复杂的业务逻辑,提高性能并降低网络流量。本篇文章...
本话题将详细讲解如何使用Java调用带有参数的Oracle存储过程,并获取存储过程返回的集合。 首先,Oracle存储过程是一种预编译的SQL语句集合,它可以在数据库服务器端执行,提高性能,减少网络传输。`PROCEDURE.sql`...
在JavaServer Pages (JSP) 中调用SQL Server存储过程是一项常见的任务,特别是在构建Web应用程序时需要执行复杂的数据库操作。存储过程是预先编译的SQL语句集合,可以在数据库服务器上执行,提供性能优化和代码复用...
通过学习《Java存储过程学习必看.doc》和《sqlserver存储过程入门例子加讲解.pdf》,你将能够深入了解如何在Java中有效地使用SQL Server的存储过程,包括参数传递、事务控制、异常处理等高级主题。这两个文档应该...
总的来说,Java调用SQL Server存储过程涉及以下几个关键点: 1. 加载JDBC驱动。 2. 建立数据库连接。 3. 创建CallableStatement对象,设置SQL语句,使用问号作为占位符。 4. 注册输出参数,并设置输入参数。 5. 执行...
Java调用SQL_Server的存储过程详解 1使用不带参数的存储过程 2使用带有输入参数的存储过程 3使用带有输出参数的存储过程 4 使用带有返回状态的存储过程 5 使用带有更新计数的存储过程
在Java应用程序中,你可以使用JDBC(Java Database Connectivity)来调用SQL Server的存储过程。以下是一个简单的示例: ```java import java.sql.*; public class CallSPExample { public static void main...
### JSP调用SQL Server的存储过程 在本篇文章中,我们将探讨如何通过JSP页面来调用SQL Server中的存储过程。此示例涉及到数据库表的创建、存储过程的定义以及JSP页面上的具体实现。 #### 数据库表的创建 首先,...
在Java编程中,调用Microsoft SQL Server(MS SQL)的存储...这就是Java调用MS SQL存储过程的基本步骤。确保遵循最佳实践,如使用连接池管理数据库连接,以及在生产环境中处理异常和错误,以提高程序的稳定性和性能。
通过以上两个示例,我们可以看到使用Java调用SQL Server数据库中的存储过程是比较简单的。关键在于正确地建立数据库连接、准备`CallableStatement`以及处理可能的异常情况。在实际应用中,还需要注意资源的管理和...
存储过程是一组预编译的SQL语句,可以接受参数、返回结果集,甚至可以包含控制流程语句,如循环和条件判断。存储过程有以下几个主要优点: 1. 提高性能:由于存储过程预先编译,执行时只需调用即可,减少了解析和...
SQL Server 中存储过程比直接运行 SQL 语句慢的原因 在 SQL Server 中,存储过程比直接运行 SQL 语句慢的原因是 Parameter sniffing 问题。Parameter sniffing 是指 SQL Server 在执行存储过程时,使用参数的统计...
实例讲解JSP调用SQL Server的存储过程 知识点一:创建表 在SQL Server中,创建表是使用CREATE TABLE语句来实现的。在这个例子中,我们创建了一个名为BookUser的表,包含了多个字段,例如UserID、UserName、Title、...
### Java调用Oracle与SQL Server存储过程的通用方法 #### 1. **建立数据库连接** 在Java中,使用JDBC(Java Database Connectivity)来连接数据库。根据`dbType`参数动态选择正确的数据源,即Oracle或SQL Server的...