您的位置:首页 > 其它

解析Excel注释,填充并生成报表的一个例子

2007-04-19 16:11 621 查看
数据库设计:
Table 信息表字段:
SYS_TABLE_NO
SYS_TABLE_NAME
SYS_TABLE_CHS_NAME
SYS_APP_ID
SYS_TABLE_IF_BASE_TABLE

列信息表字段
SYS_COLUMN_ID
SYS_APP_ID
SYS_OBJECT_ID
SYS_TABLE_NO
SYS_COLUMN_NO
SYS_COLUMN_NAME
SYS_COLUMN_CHS_NAME
SYS_COLUMN_TYPE
SYS_COLUMN_LENGTH
SYS_COLUMN_ISNULLABLE
SYS_COLUMN_AUTOVAL
SYS_STORAGE_TYPE

Excel批注信息:
(1403182083,32,1,4,0,1,0,0,0,1,30,2,0)
XXXXX_XXX_XXXXXXX
类型:XXX
时间:0月0日1:30

解析Excel批注信息,生成对应的Sql语句。
SqlParse.java

import java.util.Calendar;

import org.eimhe.bean.SysColumnInfo;
import org.eimhe.bean.SysTableInfo;
import org.eimhe.dao.SysColumnInfoDao;
import org.eimhe.dao.SysTableInfoDao;
class ReceiveData{
long columnId; //列号
long recordKey1; //电厂号或区域号
long recordKey2; //机组号
int timeType; //timetype
int dataValue; //0采样值
int typeValue; //数据类型
int yearValue;
int monthValue;
int DayValue;
int hourValue;
int minuteValue;
int formulaValue;

}
public class SqlParser {
private String sqlColname="";
private long sqlTableNo=0l;
private String sqlTableName="";
private int objectType=0;
private String year="",month="",day="";
private static int periodId=0;
private static String[] x;
private static StringBuffer result;
int i,j;
private static SysColumnInfo sysColumnInfo=new SysColumnInfo();//系统列信息
private static SysTableInfo sysTableInfo=new SysTableInfo();//系统表信息
private static SysColumnInfoDao sysColumnInfoDao=new SysColumnInfoDao();
private static SysTableInfoDao sysTableInfoDao=new SysTableInfoDao();
private static ReceiveData rd;
public static String sqlParser2(String comment,Calendar cal){
// x[0]-----列号
// x[1]-----电厂号或区域号
// x[3]-----机组号
// x[4]-----timetype
// x[5]-----0采样值
// x[6]-----数据类型
// x[7]-----年
// x[8]-----月
// x[9]-----日
// x[10]-----时
// x[11]-----分
// x[12]-----公式
x=comment.split(",");
rd=new ReceiveData();
try{
rd.columnId=Long.parseLong(x[0]);
rd.recordKey1=Long.parseLong(x[1]);
rd.recordKey2=Long.parseLong(x[2]);
rd.timeType=Integer.parseInt(x[3]);
rd.dataValue=Integer.parseInt(x[4]);
rd.typeValue=Integer.parseInt(x[5]);
rd.yearValue=Integer.parseInt(x[6]);
rd.monthValue=Integer.parseInt(x[7]);
rd.DayValue=Integer.parseInt(x[8]);
rd.hourValue=Integer.parseInt(x[9]);
rd.minuteValue=Integer.parseInt(x[10]);
rd.formulaValue=Integer.parseInt(x[11]);
}catch(Exception e){
System.err.println("Exception for OutBoundOfArray");
e.printStackTrace();
}

sysColumnInfo=(SysColumnInfo) sysColumnInfoDao.find(rd.columnId);
sysTableInfo=(SysTableInfo) sysTableInfoDao.find(sysColumnInfo.getSysTableNo());
result=new StringBuffer();
result.append("select ");
result.append(sysColumnInfo.getSysColumnName().trim());
result.append(" from ");
result.append(sysTableInfo.getSysTableName());
result.append(" where ");
switch((sysColumnInfo.getSysObjectId()).intValue()){
case 1: //公司
result.append("COMPANY_ID =");
result.append(rd.recordKey1);
result.append(" AND ");
break;
case 2: //电厂
result.append("POWER_PLANT_ID =");
result.append(rd.recordKey1);
result.append(" AND ");
break;
case 3://机组
result.append("POWER_PLANT_ID =");
result.append(rd.recordKey1);
result.append(" AND MACHINE_NO =");
result.append(rd.recordKey2);
result.append(" AND ");
break;
case 4://电网
result.append("NET_AREA_ID =");
result.append(rd.recordKey1);
result.append(" AND ");
break;
case 5://省市
result.append("REGION_ID =");
result.append(rd.recordKey1);
result.append(" AND ");
break;
case 6://省际联络线
result.append("TIELINE_ID =");
result.append(rd.recordKey1);
result.append(" AND ");
break;
case 7://线路
result.append("LINE_ID =");
result.append(rd.recordKey1);
result.append(" AND ");
break;
case 8://变压器
result.append("TRANSFORMER_ID =");
result.append(rd.recordKey1);
result.append(" AND ");
break;
}
//处理时间
if(rd.dataValue<0){
cal.add(cal.DATE,rd.DayValue);
}else if(rd.minuteValue<0){
cal.add(cal.MONTH, rd.monthValue);
}else if(rd.yearValue<0){
cal.add(cal.YEAR, rd.yearValue);
}

switch(rd.timeType){
case 4: //时段
periodId=rd.hourValue*4+(rd.minuteValue/15)+1;
result.append(" YEAR= "+cal.get(cal.YEAR));
result.append(" AND MONTH="+(cal.get(cal.MONTH)+1));
result.append(" AND DAY="+cal.get(cal.DAY_OF_MONTH));
// result.append(" AND PERIOD_ID="+periodId);
result.append(" order by period_id");
break;
case 5: //小时
periodId=rd.hourValue*4+(rd.minuteValue/15)+1;
result.append(" YEAR= "+cal.get(cal.YEAR));
result.append(" AND MONTH="+(cal.get(cal.MONTH)+1));
result.append(" AND DAY="+cal.get(cal.DAY_OF_MONTH));
// result.append(" AND PERIOD_ID="+periodId);
result.append(" order by period_id");
break;
case 3: //日
result.append(" YEAR= "+cal.get(cal.YEAR));
result.append(" AND MONTH="+(cal.get(cal.MONTH)+1));
result.append(" AND DAY="+cal.get(cal.DAY_OF_MONTH));
break;
case 2:
result.append(" YEAR= "+cal.get(cal.YEAR));
result.append(" AND MONTH="+(cal.get(cal.MONTH)+1));
break;
case 1:
result.append(" YEAR= "+cal.get(cal.YEAR));
break;
}
return result.toString();
}

}

加载Workbook,
Workbookpool.java

package org.eimhe.poi;

import java.io.FileInputStream;
import java.util.concurrent.ConcurrentHashMap;

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

public class WorkbookPool {
private static final String fileNames="日前竞价_全.xls";
private static final ConcurrentHashMap sheets=new ConcurrentHashMap();
private static FileInputStream fis;
private static HSSFWorkbook workbook;

static {
try{
fis=new FileInputStream(System.getProperty("user.dir")+"/templet/"+fileNames);
workbook=new HSSFWorkbook(fis);
// String[] fn=fileNames.split(",");
for(int i=0;i<workbook.getNumberOfSheets();i++){
sheets.put(workbook.getSheetName(i),workbook.getSheetAt(i));
System.out.println(workbook.getSheetName(i));
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void close(){
sheets.clear();
}
public static void reloadTemplet(){
new WorkbookPool();
}
public static HSSFWorkbook getWorkbook(String fileName){
return workbook;
}
public static HSSFSheet getSheet(String sheetName){
return (HSSFSheet)sheets.get(sheetName);
}
}

模版Bean
package org.eimhe.poi;

import java.util.Calendar;

public class TempletBean {
private String templetName; //模版名称
private String year;
private String month;
private String day;
private int machineNo;
private int powerPlantID;
private int netAreaID;
private int regionID;

private String filePath;
private String relativeCell; //相对单元格
private String fillColNum;
private String returnRange;
private String sql; //要查询数据库的Sql语句
private String viewRange;
private Calendar cal=Calendar.getInstance();

// public TempletBean() {
// // TODO Auto-generated constructor stub
// machineNo=0;
// }
public TempletBean(String year,String month,String day) {
// TODO Auto-generated constructor stub
this.year=year;
this.month=month;
this.day=day;
cal.set(Integer.parseInt(year), Integer.parseInt(month)-1, Integer.parseInt(day));
machineNo=0;
}
public String getDay() {
return day;
}

public void setDay(String day) {
this.day = day;
}

public int getMachineNo() {
return machineNo;
}

public void setMachineNo(int machineNo) {
this.machineNo = machineNo;
}

public String getMonth() {
return month;
}

public void setMonth(String month) {
this.month = month;
}

public int getNetAreaID() {
return netAreaID;
}

public void setNetAreaID(int netAreaID) {
this.netAreaID = netAreaID;
}

public int getPowerPlantID() {
return powerPlantID;
}

public void setPowerPlantID(int powerPlantID) {
this.powerPlantID = powerPlantID;
}

public int getRegionID() {
return regionID;
}

public void setRegionID(int regionID) {
this.regionID = regionID;
}

public String getTempletName() {
return templetName;
}

public void setTempletName(String templeName) {
this.templetName = templeName;
}

public String getYear() {
return year;
}

public void setYear(String year) {
this.year = year;
}

public String getRelativeCell() {
if(templetName.equals("日前竞价_报厂领导_#1机、#2机") || templetName.equals("日前竞价_报厂领导_#3机、#4机")){
relativeCell="E6";
}
if(templetName.equals("日前竞价_报价")){
relativeCell="G8";
}
return relativeCell;
}

public void setRelativeCell(String relativeCell) {
this.relativeCell = relativeCell;
}
public String getFillColNum() {
if(templetName.equals("日前竞价_报厂领导_#1机、#2机") || templetName.equals("日前竞价_报厂领导_#3机、#4机")){
fillColNum="C6,D6,E6,F6,G6,H6,I6,J6,K6,L6,M6,N6,O6,P6,Q6,R6,S6,T6,U6,V6,W6,X6,Y6,Z6,AA6,AB6,AI6,AK6,AM6";
}
if(templetName.equals("日前竞价_报价")){
fillColNum="D8,E8,G8,H8,I8,J8,K8,L8,M8,N8,O8,P8,Q8,R8,S8,T8,U8,V8,W8,X8,Y8,Z8,AA8,AB8,AC8,AD8,AE8,AF8,AG8,AH8,AI8,AJ8,AK8,AL8,AM8,AN8,AO8,AP8,AQ8,AR8,AS8";
}
return fillColNum;
}

public String getReturnRange() {
if(templetName.equals("日前竞价_报厂领导_#1机、#2机") || templetName.equals("日前竞价_报厂领导_#3机、#4机")){
returnRange="C6,AH102";
}
if(templetName.equals("日前竞价_报价")){
returnRange="D8,AS107";
}
return returnRange;
}

public void setReturnRange(String returnRange) {
this.returnRange = returnRange;
}
// public void setSql(String sql) {
// this.sql = sql;
// }

public String getViewRange() {
if(templetName.equals("日前竞价_报厂领导_#1机、#2机") || templetName.equals("日前竞价_报厂领导_#3机、#4机")){
// returnRange="0,3:95,24";
}
if(templetName.equals("日前竞价_报价")){
viewRange="(0,3):(95,24)";
}
return viewRange;
}

public void setViewRange(String viewRange) {
this.viewRange = viewRange;
}
public Calendar getCal() {
return cal;
}
public void setCal() {
cal.set(Integer.parseInt(year), Integer.parseInt(month)-1, Integer.parseInt(day));
}
}
workbookBean
package org.eimhe.poi;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
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.usermodel.HSSFFormulaEvaluator.CellValue;
import org.apache.poi.hssf.util.CellReference;

public class WorkbookBean {
private HSSFWorkbook workbook;

private ResultSet rs;

private TempletBean tpBean;

private String[] fillColNum;

private String outXml = "";

private HSSFSheet sheet = null;

private HSSFRow row = null,itRow=null;

private HSSFCell cell = null;

private HSSFFormulaEvaluator evaluator = null;
private HSSFComment comment=null;
private CellValue cellvalue;

private CellReference cellReference = null;

private float value;
private String strSql="";
private int i, j, relativeRowNum, relativeColNum; //相对行列。

public WorkbookBean() {
// TODO Auto-generated constructor stub
}

public HSSFWorkbook getWorkbook() throws Exception {
return workbook;
}

public void setWorkbook() throws Exception {
System.out.println(System.getProperty("user.dir"));
// FileInputStream fis=new
// FileInputStream(System.getProperty("user.dir")+"/templet/电厂_日前竞价_报厂领导.xls");
// workbook=new HSSFWorkbook(fis);
workbook = WorkbookPool.getWorkbook(tpBean.getTempletName() + ".xls");
sheet = WorkbookPool.getSheet("日前竞价_报价");
// if(tpBean.getMachineNo()!=0){
// sheet=workbook.getSheetAt(tpBean.getMachineNo()-1);
// }
Connection sqlConn = Connect.getSqlserverConnection();
Statement st = sqlConn.createStatement();
// System.out.println(tpBean.getSql());

fillColNum = tpBean.getFillColNum().split(",");
cellReference = new CellReference(tpBean.getRelativeCell());
relativeRowNum = cellReference.getRow();
relativeColNum = cellReference.getCol();

row=sheet.getRow(relativeRowNum);
int fillLength=row.getLastCellNum();
for(i=0;i<fillLength;i++){
cell=row.getCell((short) (i));
if(cell==null){
continue;
}
comment = cell.getCellComment();
if(comment==null){
continue;
}else{
strSql=Comment.toSql(comment,tpBean.getCal());
System.out.println(strSql);
rs=st.executeQuery(strSql);
}
for(j=0;rs.next();j++){
value=rs.getFloat(1);
if (!rs.wasNull()) {
itRow=sheet.getRow(j+relativeRowNum);
cell = itRow.getCell((short) i);
cell.setCellValue(value);
}
}
}

}

public TempletBean getTpBean() {
return tpBean;
}

public void setTpBean(TempletBean tpBean) {
this.tpBean = tpBean;
}

public String[] getFillColNum() {
return tpBean.getFillColNum().split(",");
}

public String getOutXml() {
try {
formXml();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return outXml;
}

public void setOutXml(String outXml) {
this.outXml = outXml;
}

void formXml() throws Exception {
// setWorkbook();
// sheet=workbook.getSheetAt(tpBean.getMachineNo()-1);
evaluator = new HSSFFormulaEvaluator(sheet, workbook);
cellvalue = null;
row = null;
cell = null;
int[] start = new int[2];
int[] end = new int[2];
String[] returnRange = tpBean.getReturnRange().split(",");
cellReference = new CellReference(returnRange[0]);
start[0] = cellReference.getRow();
start[1] = cellReference.getCol();
cellReference = new CellReference(returnRange[1]);
end[0] = cellReference.getRow();
end[1] = cellReference.getCol();
System.out.println("Start:" + start[0] + "," + start[1] + "/nend:"
+ end[0] + "," + end[1]);
for (i = start[0]; i < end[0] + 1; i++) {
outXml = outXml + " <ROW id=/"" + (i-start[0]) + "/">/n ";
row = sheet.getRow(i);
for (j = start[1]; j < end[1] + 1; j++) {
cell = row.getCell((short) j);
if (cell == null) {
continue;
}
evaluator.setCurrentRow(row);
cellvalue = evaluator.evaluate(cell);
switch (cellvalue.getCellType()) {
case HSSFCell.CELL_TYPE_BOOLEAN:
System.out.print(cellvalue.getBooleanValue() + "/t");
outXml = outXml + cellvalue.getBooleanValue() + ",";
break;
case HSSFCell.CELL_TYPE_NUMERIC:
System.out.print((int) cellvalue.getNumberValue() + "/t");
outXml = outXml + (int) cellvalue.getNumberValue() + ",";
break;
case HSSFCell.CELL_TYPE_STRING:
System.out.print(cellvalue.getStringValue() + "/t");
outXml = outXml + cellvalue.getStringValue() + ",";
break;
case HSSFCell.CELL_TYPE_BLANK:
System.out.print("blank/t");
outXml = outXml + "blank,";
break;
case HSSFCell.CELL_TYPE_ERROR:
break;
// CELL_TYPE_FORMULA will never happen
case HSSFCell.CELL_TYPE_FORMULA:
break;
}
}
System.out.println("---" + i + "---" + j + "--");
outXml = outXml.substring(0, outXml.length() - 1)
+ "/n </ROW>/n";
}
outXml = "<?xml version=/"1.0/" encoding=/"UTF-8/" ?>/n" + "<ROOT>/n"
+ " <WORKBOOK name=/"/">/n" + " <SHEET name=/"/" date=/"/" viewRange=/""+tpBean.getViewRange()+"/">/n"
+ outXml + " </SHEET>/n" + " </WORKBOOK>/n" + "</ROOT>/n";
System.out.println(outXml);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: