Jmh2013
Jmh2013

Reputation: 2777

Include links in exported excel file

I am creating a query and then downloading it into an excel document. I would like to include some links inside the excel document but cannot figure out how to do it. I tried just putting an anchor tag in the querySetCell() value, but that just prints the html inside the excel file, the html does not get parsed. I'm using CF10. Below is my code, any advice is appreciated.

<cfset q = queryNew("#columnNames#")>

<cfset queryAddRow(q)>
<cfset querySetCell(q, "Attributes", "Part Number")>
<cfset querySetCell(q, "PrimaryPart", "#local.primaryPart.getProductNumber()#")>
<cfset i = 0>
<cfloop array="#local.comparableParts#" index="part">
    <cfset i++>
    <cfset querySetCell(q, "alternatePart"& i, "#part.getPartNumber()#")>
</cfloop>

<cfspreadsheet action="write" query="q" filename="partCompare.xls" overwrite="true" />

<!--- Make a spreadsheet object --->
<cfset s = spreadsheetNew()>
<!--- Add header row --->
<cfset spreadsheetAddRow(s, "#columnNames#")>
<!--- format header --->    
<cfset spreadsheetFormatRow(s, {bold=true, fgcolor="lemon_chiffon"}, 1)>

<cfset spreadsheetAddRows(s, q)>

<cfheader name="content-disposition" value="attachment; filename=partCompare.xls">
<cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(s)#" reset="true">


UPDATE: I made some changes to my code based on the comments. The links do show up in the excel document now, but the 'friendly name' shows as a 0 until I click the 'enable editing' button in excel. It would be nice if the friendly name is displayed from the beginning but if it is not possible, or depends on user settings, this should be fine.

<cfset partCompareQueryObj = queryNew("#columnNames#")>

<cfset queryAddRow(partCompareQueryObj)>
<cfset querySetCell(partCompareQueryObj, "Attributes", "Part Number")>
<cfset querySetCell(partCompareQueryObj, "PrimaryPart", "#local.primaryPart.getProductNumber()#")>
<cfset i = 0>
<cfloop array="#local.comparableParts#" index="part">
    <cfset i++>
    <cfset querySetCell(partCompareQueryObj, "alternatePart"& i, "#part.getPartNumber()#")>
</cfloop> 

<cfspreadsheet action="write" query="partCompareQueryObj" filename="partCompare.xls" overwrite="true" />

<!--- Make a spreadsheet object --->
<cfset partCompareSpreadSheet = spreadsheetNew()>

<!--- Add header row --->
<cfset spreadsheetAddRow(partCompareSpreadSheet, "#columnNames#")>
<!--- format header --->    
<cfset spreadsheetFormatRow(partCompareSpreadSheet, {bold=true, fgcolor="lemon_chiffon"}, 1)>

<cfset spreadsheetAddRows(partCompareSpreadSheet, partCompareQueryObj)>

<cfset SpreadsheetSetCellFormula(partCompareSpreadSheet, 'HYPERLINK("http://www.google.com","#local.primaryPart.getProductNumber()#")', 2, 2)>
<cfset i = 0>
<cfloop array="#local.comparableParts#" index="part">
    <cfset i++>
    <cfset SpreadsheetSetCellFormula(partCompareSpreadSheet, 'HYPERLINK("http://www.google.com","#local.primaryPart.getProductNumber()#")', 2, i+2)>
</cfloop>

<cfheader name="content-disposition" value="attachment; filename=partCompare.xls">
<cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(partCompareSpreadSheet)#" reset="true">

Upvotes: 3

Views: 1636

Answers (1)

Adrian J. Moreno
Adrian J. Moreno

Reputation: 14859

Make sure to wrap a call to Excel's Hyperlink() function with a call to ColdFusion's SpreadsheetSetCellFormula() function.

<cfset spreadsheetSetCellFormula(sheetName
                  , 'HYPERLINK(url, linkText)'
                  , rowNumber
                  , columnNumber)>

Upvotes: 5

Related Questions