華表Cell檔案匯入匯出

iteye_18961發表於2010-03-21

    在福州出差ing……使用華表Cell和Sybase、Cognos做專案……這段經歷被前輩稱為地獄歷險記,用的sybase是12.5,Cognos是8.1,華表Cell版本,等等,我查一下,哦,是5.2.6.0809……

    翻看華表Cell元件的示例程式,官方的例子十分可怕,在瀏覽器里載入ActiveX控制元件(這並不可怕,可怕的是),接著呼叫華表API中的方法SetCellString()來逐個單元格寫入資料到ActiveX控制元件中——這是從Cell檔案載入資料到介面的控制元件。

 

    來說說功能需求,要從Cell檔案中讀取報表資料,匯入到資料庫中,看似簡單唯美,但依據官方的例子實難完成。

    按官方的例子,首先建立Cell元件的ActiveX控制元件在頁面上,假定為

 

<object id="DCellWeb1" style="left: 0px; width: 100%; top: 0px; height: 900px;" 
    codebase="CellWeb5.cab#version=5,3,8,0429" classid="clsid:3F166327-8030-4881-8BD2-EA25350E574A" >
    <param name="_Version" value="65536" />
    <param name="_ExtentX" value="10266" />
    <param name="_ExtentY" value="7011" />
    <param name="_StockProps" value="0" />
</object>

 

    使用Cell元件開啟本地的某個Cell檔案,這樣Cell檔案中的資料就載入到了Cell控制元件中

 

document.getElementById("DCellWeb1").openfile("D:\\temp\\test.cll","");

 

 

    獲取Cell控制元件中的資料內容,程式碼如下:

 

var dcell = document.getElementById("DCellWeb1");
var sendTxt = "";
// Sheet頁數
var sheetCount = dcell.GetTotalSheets();
for(var sheet=0; sheet<sheetCount; i++){
    dcell.SetCurSheet(sheet);

    // 獲取當前頁總列數、行數
    var colCount = dcell.GetCols(sheet);
    var rowCount = dcell.GetRows(sheet);

    // 獲取當前頁資料區域的起始列數、行數
    var leftCol = dcell.GetLeftCol();
    var topRow = dcell.GetTopRow();
    
    // 按行、列,獲取所有單元格的資料
    for (row=topRow; row<rowCount; row++) {
        for (col=leftCol; col<colCount; col++) {
    	      var sValue = dcell.GetCellString(col, row, sheet);
  	        if(sValue=="")
  	            sValue=" ";
  	        sendTxt+=sValue;
  	        if(col < colCount - 1)
  	            sendTxt+=","; 
        }
        if(row < rowCount - 1)
            sendTxt+="!";
    }
}

 

 

    按上面的方法,逐個單元格遍歷資料,而後組裝起來,使用Ajax等方式向後臺傳輸即可。但是這樣做其實不對,因為日常辦公面對的統計表格通常都有200多行,100多列,Sheet頁都有20個左右,粗略計算一下,GetCellString方法的呼叫次數多達40多萬次,在IE下跑了一下,大約組裝過程需要40秒左右。

    放棄這條思路,往如何獲取整塊資料的思路上去搜尋API,由於官方論壇在維護,API文件組織上的問題,查了很久才找到如下2個方法:

 

SaveToXML

ReadFromXML

 

    用這兩個方法可以整體獲取或寫入Cell控制元件中的資料內容。示例如下:

 

// 以xml形式,獲取dcell中的內容
var xmlcontent = dcell.SaveToXML('');

// xmlcontent為xml形式組織的資料內容,將這些內容寫入到dcell元件中
dcell.ReadFromXML(xmlcontent);

 

    這樣就完整的獲取了Cell元件中的資料內容,呼叫效率自然是相當的高,大約同上面的報表資料量,只需要0.2秒左右。剩下來的工作就是將這些內容傳遞到後臺,並使用Dom4j或XStream等工具包對XML資料內容進行解析處理。

 

相關文章