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

数据库设计:

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

时间:001: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);

       }

 

}

 

 

 

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值