User Guide Cancel

cfspreadsheet

 

Description

Manages Excel spreadsheet files:

  • Reads a sheet from a spreadsheet file and stores it in a ColdFusion spreadsheet object, query, CSV string, or HTML string.
  • Writes single sheet to a new XLS file from a query, ColdFusion spreadsheet object, or CSV string variable.
  • Add a sheet an existing XLS file.

Category

Syntax

The tag syntax depends on the action attribute value:

Read
<cfspreadsheet
action="read"
src = "filepath"
columns = "range"
columnnames = "comma-delimited list"
excludeHeaderRow = "true | false"
format = "CSV|HTML"
headerrow = "row number"
name = "text"
query = "query name"
rows = "range"
sheet = "number"
sheetname = "text">
Update
<cfspreadsheet
action="update"
filename = "filepath"
format = "csv"
name = "text"
password = "password"
query = "query name"
sheetname = "text" >
Write
<cfspreadsheet
action="write"
autosize="true|false"
filename = "filepath"
format = "csv"
name = "text"
overwrite = "true | false"
password = "password"
query = "queryname"
sheetname = "text"
autosize = "true | false" >
Read <cfspreadsheet action="read" src = "filepath" columns = "range" columnnames = "comma-delimited list" excludeHeaderRow = "true | false" format = "CSV|HTML" headerrow = "row number" name = "text" query = "query name" rows = "range" sheet = "number" sheetname = "text"> Update <cfspreadsheet action="update" filename = "filepath" format = "csv" name = "text" password = "password" query = "query name" sheetname = "text" > Write <cfspreadsheet action="write" autosize="true|false" filename = "filepath" format = "csv" name = "text" overwrite = "true | false" password = "password" query = "queryname" sheetname = "text" autosize = "true | false" >
Read  
<cfspreadsheet   
    action="read" 
   src = "filepath" 
    columns = "range" 
    columnnames = "comma-delimited list" 
    excludeHeaderRow = "true | false" 
    format = "CSV|HTML" 
    headerrow = "row number" 
    name = "text" 
    query = "query name" 
    rows = "range" 
    sheet = "number" 
    sheetname = "text">  
   
Update  
<cfspreadsheet  
    action="update" 
    filename = "filepath" 
    format = "csv" 
    name = "text" 
    password = "password" 
    query = "query name" 
    sheetname = "text" >  
   
Write  
<cfspreadsheet   
    action="write" 
    autosize="true|false" 
    filename = "filepath" 
    format = "csv" 
    name = "text" 
    overwrite = "true | false" 
    password = "password" 
    query = "queryname" 
    sheetname = "text" 
    autosize = "true | false" >

See also

Sreadsheet functions.

History

ColdFusion (2025 release): You can no longer read password-protected Excel files without specifying the password. If you skip the password attribute in the read action, you will get an exception. As a result, you’ll also be unable to update the file as the read action will produce the exception. View the examples for more information.

ColdFusion 11: Added the attribute autosize.

ColdFusion 9.0.1: Added the attribute {{excludeHeaderRow}}

ColdFusion 9: Added this tag.

Attributes

Attribute

Action

Req/Opt

Default

Description

action

All

Required

 

One of the following:

  • read-Reads the contents of an XLS format file.
  • update-Adds a new sheet to an existing XLS file. You cannot use the uppdate action to change an existing sheet in a file. For more information, see Usage.
  • write-Writes a new XLS format file or overwrites an existing file.
autosize write Optional true

By default the value of this attribute is true. The columns in a sheet resize to accommodate the contents. To avoid resizing the columns, set it to false.

Note: Auto sizing can be relatively slow on large sheets.

filename

{{update, write}}r

Required

 

The pathname of the file that is written.

excludeHeaderRow

read

Optional

false

If set to true, excludes the headerrow from being included in the query results.
The attribute helps when you read Excel as a query. When you specify the headerrow attribute, the column names are retrieved from the header row. But they are also included in the first row of the query. To not include the header row, set true as the attribute value.

name

All

name or query is required.

 

  • read action: The variable in which to store the spreadsheet file data. Specify name or query.
  • write and update actions: A variable containing CSV-format data or an ColdFusion spreadsheet object containing the data to write. Specify the name or query.

query

All

name or query is required.

 

  • read action: The query in which to store the converted spreadsheet file. Specify format, name, or query.
  • write and update actions: A query variable containing the data to write. Specify name or query.

src

read

Required

 

The pathname of the file to read.

columns

read

Optional

 

Column number or range of columns. Specify a single number, a hypen-separated column range, a comma-separated list, or any combination of these; for example: 1,3-6,9.

Note: Setting a range higher than the actual number of columns in sheet results in an exception when accessing columns which are yet to be added.

columnnames

read

Optional

 

Comma-separated column names.

format

All

Optional

For read, save as a spreadsheet object.
For update and write: Save a spreadsheet object.

Format of the data represented by the name variable.

  • All: csv - On read, converts an XLS file to a CSV variable.
  • On update or write, Saves a CSV variable as an XLS file.
  • Read only: html-Converts an XLS file to an HTML variable.
    The cfspreadsheet tag always writes spreadsheet data as an XLS file. To write HTML variables or CSV variables as HTML or CSV files, use the cffile tag.

headerrow

read

Optional

 

Row number that contains column names.

overwrite

write

Optional

false

A Boolean value specifying whether to overwrite an existing file.

password

updatewrite

Optional

 

Set a password for modifying the sheet.
Note: Setting a password of the empty string does no unset password protection entirely; you are still prompted for a password if you try to modify the sheet.

rows

read

Optional

 

The range of rows to read. Specify a single number, a hypen-separated row range, a comma-separated list, or any combination of these; for example: 1,3-6,9.

sheet

read

Optional

 

Number of the sheet. For the read action, you can specify sheet or sheetname.

sheetname

All

Optional

 

Name of the sheet For the read action, you can specify sheet or sheetname. For write and update actions, the specified sheet is renamed according to the value you specify for sheetname.

Usage

Each ColdFusion spreadsheet object represents Excel sheet:

  • To read an Excel file with multiple sheets, use multiple cfspreadsheet tags with the read option and specify different name and sheet or sheetname attributes for each sheet.
  • To write multiple sheets to a single file, use the write action to create the file and save the first sheet and use the update action to add each additional sheet.
  • To update an existing file, read all sheets in the file, modify one or more sheets, and use the contents, and use the write action and Update actions (for multiple sheet files) to rewrite the entire file.
    The cfspreadsheet tag writes only XLS format files. To write a CSV file, put your data in a CSV formatted string variable and use the cffile tag to write the variable contents in a file.Use the ColdFusion Spreadsheet* functions, such as SpreadsheetNew and SpreadsheetAddColumn to create a new ColdFusion Spreadsheet object and modify the spreadsheet contents.

Example

The following example uses the cfspreadsheet tag to read and write Excel spreadsheets using various formats. It also shows a simple use of ColdFusion Spreadsheet functions to modify a sheet.

<!--- Read data from two datasource tables. --->
<cfquery
name="courses" datasource="cfdocexamples"
cachedwithin="#CreateTimeSpan(0, 6, 0, 0)#">
SELECT CORNUMBER,DEPT_ID,COURSE_ID,CORNAME
FROM COURSELIST
</cfquery>
<cfquery
name="centers" datasource="cfdocexamples"
cachedwithin="#CreateTimeSpan(0, 6, 0, 0)#">
SELECT *
FROM CENTERS
</cfquery>
<cfscript>
//Use an absolute path for the files. --->
theDir=GetDirectoryFromPath(GetCurrentTemplatePath());
theFile=theDir & "courses.xls";
//Create two empty ColdFusion spreadsheet objects. --->
theSheet = SpreadsheetNew("CourseData");
theSecondSheet = SpreadsheetNew("CentersData");
//Populate each object with a query. --->
SpreadsheetAddRows(theSheet,courses);
SpreadsheetAddRows(theSecondSheet,centers);
</cfscript>
<!--- Write the two sheets to a single file --->
<cfspreadsheet action="write" filename="#theFile#" name="theSheet"
sheetname="courses" overwrite=true>
<cfspreadsheet action="update" filename="#theFile#" name="theSecondSheet"
sheetname="centers">
<!--- Read all or part of the file into a spreadsheet object, CSV string,
HTML string, and query. --->
<cfspreadsheet action="read" src="#theFile#" sheetname="courses" name="spreadsheetData">
<cfspreadsheet action="read" src="#theFile#" sheet=1 rows="3,4" format="csv" name="csvData">
<cfspreadsheet action="read" src="#theFile#" format="html" rows="5-10" name="htmlData">
<cfspreadsheet action="read" src="#theFile#" sheetname="centers" query="queryData">
<h3>First sheet row 3 read as a CSV variable</h3>
<cfdump var="#csvData#">
<h3>Second sheet rows 5-10 read as an HTML variable</h3>
<cfdump var="#htmlData#">
<h3>Second sheet read as a query variable</h3>
<cfdump var="#queryData#">
<!--- Modify the courses sheet. --->
<cfscript>
SpreadsheetAddRow(spreadsheetData,"03,ENGL,230,Poetry 1",8,1);
SpreadsheetAddColumn(spreadsheetData,
"Basic,Intermediate,Advanced,Basic,Intermediate,Advanced,Basic,Intermediate,Advanced",
3,2,true);
</cfscript>
<!--- Write the updated Courses sheet to a new XLS file --->
<cfspreadsheet action="write" filename="#theDir#updatedFile.xls" name="spreadsheetData"
sheetname="courses" overwrite=true>
<!--- Write an XLS file containing the data in the CSV variable. --->
<cfspreadsheet action="write" filename="#theDir#dataFromCSV.xls" name="CSVData"
format="csv" sheetname="courses" overwrite=true>
<!--- Read data from two datasource tables. ---> <cfquery name="courses" datasource="cfdocexamples" cachedwithin="#CreateTimeSpan(0, 6, 0, 0)#"> SELECT CORNUMBER,DEPT_ID,COURSE_ID,CORNAME FROM COURSELIST </cfquery> <cfquery name="centers" datasource="cfdocexamples" cachedwithin="#CreateTimeSpan(0, 6, 0, 0)#"> SELECT * FROM CENTERS </cfquery> <cfscript> //Use an absolute path for the files. ---> theDir=GetDirectoryFromPath(GetCurrentTemplatePath()); theFile=theDir & "courses.xls"; //Create two empty ColdFusion spreadsheet objects. ---> theSheet = SpreadsheetNew("CourseData"); theSecondSheet = SpreadsheetNew("CentersData"); //Populate each object with a query. ---> SpreadsheetAddRows(theSheet,courses); SpreadsheetAddRows(theSecondSheet,centers); </cfscript> <!--- Write the two sheets to a single file ---> <cfspreadsheet action="write" filename="#theFile#" name="theSheet" sheetname="courses" overwrite=true> <cfspreadsheet action="update" filename="#theFile#" name="theSecondSheet" sheetname="centers"> <!--- Read all or part of the file into a spreadsheet object, CSV string, HTML string, and query. ---> <cfspreadsheet action="read" src="#theFile#" sheetname="courses" name="spreadsheetData"> <cfspreadsheet action="read" src="#theFile#" sheet=1 rows="3,4" format="csv" name="csvData"> <cfspreadsheet action="read" src="#theFile#" format="html" rows="5-10" name="htmlData"> <cfspreadsheet action="read" src="#theFile#" sheetname="centers" query="queryData"> <h3>First sheet row 3 read as a CSV variable</h3> <cfdump var="#csvData#"> <h3>Second sheet rows 5-10 read as an HTML variable</h3> <cfdump var="#htmlData#"> <h3>Second sheet read as a query variable</h3> <cfdump var="#queryData#"> <!--- Modify the courses sheet. ---> <cfscript> SpreadsheetAddRow(spreadsheetData,"03,ENGL,230,Poetry 1",8,1); SpreadsheetAddColumn(spreadsheetData, "Basic,Intermediate,Advanced,Basic,Intermediate,Advanced,Basic,Intermediate,Advanced", 3,2,true); </cfscript> <!--- Write the updated Courses sheet to a new XLS file ---> <cfspreadsheet action="write" filename="#theDir#updatedFile.xls" name="spreadsheetData" sheetname="courses" overwrite=true> <!--- Write an XLS file containing the data in the CSV variable. ---> <cfspreadsheet action="write" filename="#theDir#dataFromCSV.xls" name="CSVData" format="csv" sheetname="courses" overwrite=true>
<!--- Read data from two datasource tables. ---> 
<cfquery 
       name="courses" datasource="cfdocexamples"
       cachedwithin="#CreateTimeSpan(0, 6, 0, 0)#"> 
       SELECT CORNUMBER,DEPT_ID,COURSE_ID,CORNAME 
       FROM COURSELIST 
</cfquery> 
  
<cfquery 
       name="centers" datasource="cfdocexamples"
       cachedwithin="#CreateTimeSpan(0, 6, 0, 0)#"> 
       SELECT * 
       FROM CENTERS 
</cfquery> 
      
<cfscript> 
    //Use an absolute path for the files. ---> 
       theDir=GetDirectoryFromPath(GetCurrentTemplatePath()); 
    theFile=theDir & "courses.xls"; 
    //Create two empty ColdFusion spreadsheet objects. ---> 
    theSheet = SpreadsheetNew("CourseData"); 
    theSecondSheet = SpreadsheetNew("CentersData"); 
    //Populate each object with a query. ---> 
    SpreadsheetAddRows(theSheet,courses); 
    SpreadsheetAddRows(theSecondSheet,centers); 
</cfscript> 
  
<!--- Write the two sheets to a single file ---> 
<cfspreadsheet action="write" filename="#theFile#" name="theSheet" 
    sheetname="courses" overwrite=true> 
<cfspreadsheet action="update" filename="#theFile#" name="theSecondSheet"
    sheetname="centers"> 
  
<!--- Read all or part of the file into a spreadsheet object, CSV string, 
      HTML string, and query. ---> 
<cfspreadsheet action="read" src="#theFile#" sheetname="courses" name="spreadsheetData"> 
<cfspreadsheet action="read" src="#theFile#" sheet=1 rows="3,4" format="csv" name="csvData"> 
<cfspreadsheet action="read" src="#theFile#" format="html" rows="5-10" name="htmlData"> 
<cfspreadsheet action="read" src="#theFile#" sheetname="centers" query="queryData"> 
  
<h3>First sheet row 3 read as a CSV variable</h3> 
<cfdump var="#csvData#"> 
  
<h3>Second sheet rows 5-10 read as an HTML variable</h3> 
<cfdump var="#htmlData#"> 
  
<h3>Second sheet read as a query variable</h3> 
<cfdump var="#queryData#"> 
  
<!--- Modify the courses sheet. ---> 
<cfscript> 
    SpreadsheetAddRow(spreadsheetData,"03,ENGL,230,Poetry 1",8,1); 
    SpreadsheetAddColumn(spreadsheetData, 
    "Basic,Intermediate,Advanced,Basic,Intermediate,Advanced,Basic,Intermediate,Advanced", 
    3,2,true); 
</cfscript> 
  
<!--- Write the updated Courses sheet to a new XLS file ---> 
<cfspreadsheet action="write" filename="#theDir#updatedFile.xls" name="spreadsheetData" 
    sheetname="courses" overwrite=true> 
<!--- Write an XLS file containing the data in the CSV variable. --->     
<cfspreadsheet action="write" filename="#theDir#dataFromCSV.xls" name="CSVData" 
    format="csv" sheetname="courses" overwrite=true>

Let's take chunks of the above code and see each chunk in action. For example, consider a csv file is uploaded on the web, which you want to retrieve and perform some actions.

You can also jump to ths fiddle and try out the code chunks. Sign in with your Google or Facebook credentials and launch the file cfspreadsheet.cfm.

Step 1

Read the csv file and store the response in a variable.

<cfscript>
cfhttp( name="mydata", url="https://raw.githubusercontent.com/sauravg94/test-repo/master/MOCK_DATA.csv", firstrowasheaders="true" ,method="GET");
writedump(mydata);
</cfscript>
<cfscript> cfhttp( name="mydata", url="https://raw.githubusercontent.com/sauravg94/test-repo/master/MOCK_DATA.csv", firstrowasheaders="true" ,method="GET"); writedump(mydata); </cfscript>
<cfscript>
 cfhttp( name="mydata", url="https://raw.githubusercontent.com/sauravg94/test-repo/master/MOCK_DATA.csv", firstrowasheaders="true" ,method="GET");
 writedump(mydata);
</cfscript>

Step 2

  1. Set the destination for the xlsx or xls file.
  2. Create an empty spreadsheet object.
  3. Populate the object with data fetched with cfhttp.

Note:

SpreadsheetNew(true|false)
  1. True or Yes: Creates an .xlsx file that is supported by Microsoft Office Excel 2007.
  2. False or No: Creates an .xls file.
<cfscript>
//Use an absolute path for the files.
theDir=GetDirectoryFromPath(GetCurrentTemplatePath());
theFile=theDir & "mock_data.xlsx";
//Create an empty ColdFusion spreadsheet objects.
theSheet = SpreadsheetNew(true);
//Populate the object with data fetched with cfhttp
SpreadsheetAddRows(theSheet,mydata,1);
</cfscript>
<cfscript> //Use an absolute path for the files. theDir=GetDirectoryFromPath(GetCurrentTemplatePath()); theFile=theDir & "mock_data.xlsx"; //Create an empty ColdFusion spreadsheet objects. theSheet = SpreadsheetNew(true); //Populate the object with data fetched with cfhttp SpreadsheetAddRows(theSheet,mydata,1); </cfscript>
<cfscript> 
    //Use an absolute path for the files. 
    theDir=GetDirectoryFromPath(GetCurrentTemplatePath()); 
    theFile=theDir & "mock_data.xlsx"; 
    //Create an empty ColdFusion spreadsheet objects. 
    theSheet = SpreadsheetNew(true); 
    //Populate the object with data fetched with cfhttp
    SpreadsheetAddRows(theSheet,mydata,1);
</cfscript>

Step 3

Write the sheet into a file.

<cfspreadsheet action="write" filename="#theFile#" name="theSheet" sheetname="mock_data" overwrite=true>
<cfspreadsheet action="write" filename="#theFile#" name="theSheet" sheetname="mock_data" overwrite=true>
<cfspreadsheet action="write" filename="#theFile#" name="theSheet" sheetname="mock_data" overwrite=true> 

Step 4

Read all or part of the file into a spreadsheet object, CSV string, HTML string, and query.

<cfspreadsheet action="read" src="#theFile#" sheetname="mock_data" name="spreadsheetData">
<cfspreadsheet action="read" src="#theFile#" sheet=1 rows="100-200" format="csv" name="csvData">
<cfspreadsheet action="read" src="#theFile#" format="html" rows="5-10" name="htmlData">
<cfspreadsheet action="read" src="#theFile#" sheetname="mock_data" query="queryData">
<cfspreadsheet action="read" src="#theFile#" sheetname="mock_data" name="spreadsheetData"> <cfspreadsheet action="read" src="#theFile#" sheet=1 rows="100-200" format="csv" name="csvData"> <cfspreadsheet action="read" src="#theFile#" format="html" rows="5-10" name="htmlData"> <cfspreadsheet action="read" src="#theFile#" sheetname="mock_data" query="queryData">
<cfspreadsheet action="read" src="#theFile#" sheetname="mock_data" name="spreadsheetData">

<cfspreadsheet action="read" src="#theFile#" sheet=1 rows="100-200" format="csv" name="csvData">

<cfspreadsheet action="read" src="#theFile#" format="html" rows="5-10" name="htmlData">

<cfspreadsheet action="read" src="#theFile#" sheetname="mock_data" query="queryData">

Step 5

<cfdump var="#spreadsheetData#" >
<cfoutput >
#csvData#
</cfoutput>
<cfdump var="#htmlData#" >
<cfdump var="#queryData#" >
<cfdump var="#spreadsheetData#" > <cfoutput > #csvData# </cfoutput> <cfdump var="#htmlData#" > <cfdump var="#queryData#" >
<cfdump var="#spreadsheetData#" >

<cfoutput >
 #csvData#
</cfoutput>

<cfdump var="#htmlData#" >

<cfdump var="#queryData#" >

Password protection

In the following examples, the script will attempt to read employee.xlsx, which is a password-protected file.

Example 1

Read the file with attribute password

<cfspreadsheet action="read" src="#expandPath('employee.xlsx')#" name="employee" password="abc123">
<cfdump var="#employee#" label="Result of cfspreadsheet read action (with password attribute)">
<cfspreadsheet action="read" src="#expandPath('employee.xlsx')#" name="employee" password="abc123"> <cfdump var="#employee#" label="Result of cfspreadsheet read action (with password attribute)">
<cfspreadsheet action="read" src="#expandPath('employee.xlsx')#" name="employee" password="abc123">
<cfdump var="#employee#" label="Result of cfspreadsheet read action (with password attribute)">

Example 2

Read the file without specifying the password attribute. The script will produce an exception.

cfspreadsheet action="read" src="#expandPath('employee.xlsx')#" name="employee">
<cfdump var="#employee#" label="Result of cfspreadsheet read action (without password attribute)">
cfspreadsheet action="read" src="#expandPath('employee.xlsx')#" name="employee"> <cfdump var="#employee#" label="Result of cfspreadsheet read action (without password attribute)">
cfspreadsheet action="read" src="#expandPath('employee.xlsx')#" name="employee">
<cfdump var="#employee#" label="Result of cfspreadsheet read action (without password attribute)">

Example 3

Read the file with an incorrect password, which will produce an exception.

<cfspreadsheet action="read" src="#expandPath('employee.xls')#" name="employee" password="1234">
<cfdump var="#employee#" label="Result of cfspreadsheet read action (with incorrect password attribute)">
<cfspreadsheet action="read" src="#expandPath('employee.xls')#" name="employee" password="1234"> <cfdump var="#employee#" label="Result of cfspreadsheet read action (with incorrect password attribute)">
<cfspreadsheet action="read" src="#expandPath('employee.xls')#" name="employee" password="1234">
<cfdump var="#employee#" label="Result of cfspreadsheet read action (with incorrect password attribute)">

Example 4

Now, attempt updating the file without specifying the password attribute. The read action will produce an exception.

<cfspreadsheet action="read" src="#expandPath('employee.xlsx')#" name="employee" >
<cfspreadsheet
action="update"
filename = "#expandPath('employee.xlsx')#"
name="employee"
sheetname = "sheet1"
password="abc123" >
<cfdump var="#var#" >
<cfspreadsheet action="read" src="#expandPath('employee.xlsx')#" name="employee" > <cfspreadsheet action="update" filename = "#expandPath('employee.xlsx')#" name="employee" sheetname = "sheet1" password="abc123" > <cfdump var="#var#" >
<cfspreadsheet action="read" src="#expandPath('employee.xlsx')#" name="employee" >
<cfspreadsheet
        action="update"
        filename = "#expandPath('employee.xlsx')#"
        name="employee"
        sheetname = "sheet1" 
        password="abc123" > 
<cfdump var="#var#" >

Get help faster and easier

New user?