2014-05-15 42 views
0

我有一個按鈕,可以從Xpage將視圖導出到Excel。它工作得很好,但是當用戶打開Excel時,沒有網格線,我知道他們會發瘋。我在網上搜索了一個小時,想知道如何改變這些,但我找不到。從Xpages視圖導出到Excel並保持網格線

有誰知道如何做到這一點?

這裏是我的代碼」

var output:string = ""; 
    for(i=0;i < sessionScope.searchDocIDArray.length; i++) 
    { 
    var docId=sessionScope.searchDocIDArray[i]; 
    var doc=database.getDocumentByID(docId); 

    output += "<tr>"; 
    output += "<td>" + doc.getItemValueString("user") + "</td>"; 
    output += "<td>" + doc.getItemValueString("loc") + "</td>"; 
    output += "<td>" + doc.getItemValueString("date") + "</td>"; 
    output += "<td>" + doc.getItemValueString("workCategory") + "</td>"; 
    output += "<td>" + doc.getItemValueString("state") + "</td>"; 
    output += "<td>" + doc.getItemValueString("timeSpent") + "</td>"; 
    output += "<td>" + doc.getItemValueString("notes") + "</td>"; 

    output += "</tr>"; 
    } 

    facesContext.getExternalContext().getResponse().setHeader("Content-disposition", "attachment; filename=TSC Time Spent.xlxs"); 
    facesContext.getExternalContext().getResponse().setHeader("Cache-Control", "no-cache"); 

    facesContext.getResponseWriter().write("<x:WorksheetOptions>") 
    facesContext.getResponseWriter().write("<x:Panes>"); 
    facesContext.getResponseWriter().write("</x:Panes>"); 
    facesContext.getResponseWriter().write("<x:WorksheetOptions>") 

    facesContext.getResponseWriter().write("<table><thead><tr><td><b>User</b></td><td><b>Loc</b></td><td><b>Date</b></td><td><b>Work Category</b></td><td><b>Time Spent</b></td><td><b>Notes</tr></thead>"+output+"</table>"); 
    facesContext.getResponseWriter().endDocument(); 
+0

你沒有關閉元素,如果該事項 –

+0

我非常興奮,當我看到這一點,但不幸的是我改變了它,並沒有奏效。我*真的*想找到一種方法來實現這一點。 –

回答

1

的一種方式,以確保網格線是否完好是要導出爲CSV格式,而不是使用HTML標記寫out你的內容

你也可以將css指定給你的td元素,但是邊界不會像在excel中原生的那樣。

以下是使用csv的示例。這是我的東西在afterRenderResponse使用的簡化版本:

var exCon = facesContext.getExternalContext(); 
var writer = facesContext.getResponseWriter(); 
var response = exCon.getResponse(); 
var output = ""; 
var colHeaders = "col1,col2,col3,col4,col5"; 
// Loop through data set 
while (doc != null) { 

output+="\"" + val1 + "\","; 
output+="\"" + val2 + "\","; 
output+="\"" + val3 + "\","; 
output+="\"" + val4 + "\","; 
output+="\"" + val5 + "\","; 
output += @Char(13)[email protected](10); // start a new row 
} 
response.setContentType("application/csv-tab-delimited-table;charset=utf-8"); 
response.setHeader("Cache-Control", "no-cache"); 
response.setHeader("Content-Disposition", "attachment;filename=actionExport.csv"); 
writer.write([email protected](13)[email protected](10)); // Add the first row as column titles and add line feed 
writer.write([email protected](13)[email protected](10)); // 
writer.endDocument(); 
+0

我可能想這樣,因爲我有另一個問題。這種方法並不總是在客戶端內工作。我認爲ReDirect存在一些問題。你有任何鏈接到這個例子,讓我開始。 –

+0

查看上面的代碼示例。 –

+0

我試圖讓這個工作,但遇到了一個問題。我將代碼直接放在按鈕中,而不是打開另一個文檔。我不認爲我現在可以在按鈕中完成這一切。所以我將這段代碼移到了Xpage上,我嘗試從Xpage中的按鈕打開。但在客戶端它有時會打開頁面,有時它不會。我有另一個問題打開這個:[鏈接](http://stackoverflow.com/questions/23688898/xpages-contet-redirecttopage-only-works-intermitently-in-notes-client)。 –

0

嘗試添加該:-)

<x:WorksheetOptions> 
    <x:DisplayGridlines/> 
</x:WorksheetOptions> 
+0

看起來不錯,但沒有工作。我試過DisplayGridlines = True,那也沒用。當我谷歌它說你必須是一個活動工作表。我曾經知道如何在LS中獲得,但在JS中沒有。 –

1

這將需要更多的調查,但我會建議在尋找使用Apache POI寫入到Excel中。它不會像表格方法那樣使用Excel 2007+引發安全警報。它有更多特定的API來設置樣式。 HSSF類是你想要的(代表恐怖的電子表格格式!)。

+0

保羅說。更好地導出爲本機文件。 –

相關問題