根据SQL结果集构建动态二维列表展示在excel中

近期在项目中用到根据SQL结果集构建动态二维列表展示在excel中。把它贴出来希望对大家有帮助。
数据库是mysql,操纵excel是使用apache POI SpreadSheet,如对POI不熟,请查看我的另外一文章[url=http://lhxctc.iteye.com/blog/540220]Apache POI SpreadSheet的一些简单应用[/url]。
代码如下:

import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.hssf.util.HSSFColor;
/**
*
*
* 主要是将一些数据组织成二维表以便汇总
*
* 如:
*
* 战略1 战略2 战略3
*
* 项目1 20 20 30
* 项目2 30 15 40
* ...
*
*/
public class XZou {

static Connection con = null;

static {

try {
Class.forName("com.mysql.jdbc.Driver");

con = DriverManager
.getConnection(
"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8",
"root", "root");

PreparedStatement pst = con.prepareStatement("drop table if exists project;");

pst.execute();

pst = con.prepareStatement("create table project (pro varchar(20) not null comment '项目名称',sta varchar(20) not null comment '战略名称',mark float comment '值');");

pst.execute();

pst = con.prepareStatement("insert into project (pro,sta,mark) values (?,?,?)");

///
pst.setString(1, "项目1"); pst.setString(2, "战略1"); pst.setFloat(3, 30.0f);
pst.addBatch();
pst.setString(1, "项目1"); pst.setString(2, "战略2"); pst.setFloat(3, 40.0f);
pst.addBatch();
pst.setString(1, "项目1"); pst.setString(2, "战略3"); pst.setFloat(3, 50.0f);
pst.addBatch();
pst.setString(1, "项目2"); pst.setString(2, "战略1"); pst.setFloat(3, 40.0f);
pst.addBatch();
pst.setString(1, "项目2"); pst.setString(2, "战略2"); pst.setFloat(3, 50.0f);
pst.addBatch();
pst.setString(1, "项目2"); pst.setString(2, "战略3"); pst.setFloat(3, 60.0f);
pst.addBatch();
pst.setString(1, "项目2"); pst.setString(2, "战略4"); pst.setFloat(3, 40.0f);
pst.addBatch();
pst.setString(1, "项目3"); pst.setString(2, "战略1"); pst.setFloat(3, 50.0f);
pst.addBatch();
pst.setString(1, "项目3"); pst.setString(2, "战略2"); pst.setFloat(3, 40.0f);
pst.addBatch();
pst.setString(1, "项目3"); pst.setString(2, "战略4"); pst.setFloat(3, 30.0f);
pst.addBatch();
pst.setString(1, "项目4"); pst.setString(2, "战略1"); pst.setFloat(3, 50.0f);
pst.addBatch();
pst.setString(1, "项目4"); pst.setString(2, "战略2"); pst.setFloat(3, 20.50f);
pst.addBatch();
pst.setString(1, "项目4"); pst.setString(2, "战略3"); pst.setFloat(3, 30.0f);
pst.addBatch();
pst.setString(1, "项目4"); pst.setString(2, "战略4"); pst.setFloat(3, 90.0f);
pst.addBatch();
pst.setString(1, "项目5"); pst.setString(2, "战略1"); pst.setFloat(3, 40.0f);
pst.addBatch();
pst.setString(1, "项目5"); pst.setString(2, "战略3"); pst.setFloat(3, 30.0f);
pst.addBatch();
pst.setString(1, "项目5"); pst.setString(2, "战略4"); pst.setFloat(3, 30.0f);
pst.addBatch();


pst.executeBatch();

} catch (Exception ex) {
throw new ExceptionInInitializerError(ex);
}
}

public static void main(String[] args) throws Exception {

int startRow = 8, startCell = 6;

List<X> xList = new ArrayList<X>();

PreparedStatement pst = con.prepareStatement("select pro from project group by pro");

ResultSet rs = pst.executeQuery();

while(rs.next()){

xList.add(new X(rs.getString(1)));

}

Map<String, Integer> yMap = new HashMap<String, Integer>();



pst = con.prepareStatement("select sta from project group by sta");

rs = pst.executeQuery();

int tempStartCell = startCell;

while(rs.next()){

yMap.put(rs.getString(1), ++tempStartCell);

}



pst = con.prepareStatement("select pro,sta,mark from project group by pro,sta");

rs = pst.executeQuery();

while(rs.next()){


for(X x: xList){

if(x.getName().equals(rs.getString(1))){

x.getYList().add(new Y(rs.getString(2),rs.getFloat(3)));
}

}

}

rs.close();

pst.close();



HSSFWorkbook wb = new HSSFWorkbook();

HSSFSheet sheet = wb.createSheet("测试");

HSSFCellStyle style = wb.createCellStyle();

HSSFFont font = wb.createFont();

font.setColor(HSSFColor.RED.index);

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中现实

style.setFont(font);//设置颜色

HSSFRow xRow = sheet.createRow(startRow - 1);//确立X,所有列

for(Iterator<Map.Entry<String, Integer>> it = yMap.entrySet().iterator(); it.hasNext(); ){

Map.Entry<String, Integer> map = it.next();

HSSFCell cell = xRow.createCell(map.getValue());

cell.setCellStyle(style);

cell.setCellValue(new HSSFRichTextString(map.getKey()));

}

for(int i = 0; i<xList.size(); i++){//确立Y,行

X x = xList.get(i);

HSSFRow row = sheet.createRow(startRow + i);//创建行

HSSFCell cell = row.createCell(startCell);

cell.setCellStyle(style);

cell.setCellValue(new HSSFRichTextString(x.getName()));

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

Y y = x.getYList().get(j);

cell = row.createCell(yMap.get(y.getName()));

cell.setCellStyle(style);

cell.setCellValue(y.getValue());

}


}

wb.write(new FileOutputStream("c:/wd.xls"));//写一个excel文件




}

}

/**
* X 项目
*/
class X{

private String name;//项目名称

private List<Y> yList = new ArrayList<Y>();//项目对应的所有的战略集合

public X(){

}
public X(String name){
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<Y> getYList() {
return yList;
}

public void setYList(List<Y> list) {
yList = list;
}




}

/**
* 战略
*/
class Y{

private String name;//战略名称

private float value;//项目名称关联战略名称对应的mark值

public Y(String name,float value){

this.name = name;

this.value = value;

}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public float getValue() {
return value;
}

public void setValue(float value) {
this.value = value;
}



}

Excel VBA,可以使用ADODB连接对象来读取Excel文件数据,而不需要打开工作表。面是一个示例代码,展示如何在不打开工作表的情况下读取数据并将其赋值给二维数组: ```vba Sub ReadDataToArray() Dim conn As Object Dim rs As Object Dim dataArr() As Variant Dim strSQL As String Dim connString As String Dim filePath As String Dim sheetName As String Dim startRow As Long, endRow As Long Dim startCol As String, endCol As String Dim i As Long, j As Long ' 设置文件路径、工作表名、起始行、结束行、起始列和结束列 filePath = "C:\YourFilePath\YourFileName.xlsx" sheetName = "Sheet1" startRow = 2 endRow = 11 startCol = "A" endCol = "D" ' 建立ADODB连接对象 Set conn = CreateObject("ADODB.Connection") ' 设置连接字符串 connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filePath & ";Extended Properties=""Excel 12.0 Xml;HDR=YES;""" ' 打开连接 conn.Open connString ' 构建SQL查询语句 strSQL = "SELECT * FROM [" & sheetName & "$" & startRow & ":" & endRow & "]" ' 执行查询并获取结果 Set rs = conn.Execute(strSQL) ' 将结果赋值给二维数组 dataArr = rs.GetRows ' 关闭结果和连接 rs.Close conn.Close ' 打印二维数组 For i = LBound(dataArr, 2) To UBound(dataArr, 2) For j = LBound(dataArr, 1) To UBound(dataArr, 1) Debug.Print dataArr(j, i) Next j Next i End Sub ``` 在代码,你需要将`"C:\YourFilePath\YourFileName.xlsx"`替换为你的Excel文件路径和文件名,`Sheet1`替换为你要读取的工作表名。`startRow`和`endRow`分别表示要读取的起始行和结束行,而`startCol`和`endCol`表示要读取的起始列和结束列。通过构建SQL查询语句并执行查询,我们可以获取特定区域的数据,并将其赋值给名为`dataArr`的二维数组。最后,使用循环遍历二维数组并将其打印出来。 需要注意的是,这种方法需要安装适当的驱动程序(如Microsoft ACE OLEDB)来连接Excel文件。如果你的系统上没有正确安装驱动程序,可能会导致连接失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值