Как создать таблицу с защищенными ячейками
Я создаю объект электронной таблицы, используя cfspreadsheet. Хотелось бы сделать отдельные ячейки защищенными (только для чтения). Пожалуйста, дайте мне знать, если кто-нибудь пробовал это раньше.
Я пытался поставить формат ячейки как заблокированный, но, похоже, он не работает. Вот пример кода:
<cfset a = spreadsheetnew()>
<cfset format1 = structNew()>
<cfset format1.locked=true>
<cfset SpreadsheetFormatCell(a,format1,1,1)>
<cfspreadsheet action="write" filename="#expandpath('.')#/test.xls" name="a" overwrite="true">
Благодарю.
1 ответ
Блокировка ячейки ничего не делает, если лист не защищен, т.е. с использованием cfspreadsheet password
приписывать. Но это имеет некоторые негативные побочные эффекты...
Защита листа блокирует все ячейки. Это означает, что вам необходимо "разблокировать" все остальное, применяя формат. Теоретически вы можете просто разблокировать весь лист:
<cfset SpreadsheetFormatCellRange (sheet, {locked=false}, 1, 1, maxRow, maxCol)>
Однако, это имеет неприятный эффект заполнения каждой ячейки на листе. Поэтому, если вы прочитаете файл в запросе, запрос будет содержать ~65 536 строк и 256 столбцов. Даже если вы явно заполнили несколько ячеек.
Функция блокировки лучше подходит для случаев, когда вы хотите заблокировать все, кроме нескольких ячеек (не наоборот). Если бы это не то, что вы делаете, я бы, наверное, не стал бы этим заниматься, учитывая все негативные побочные эффекты.
Пример побочного эффекта
<cfset testFile = "c:/test.xls">
<cfset sheet = spreadsheetNew()>
<!--- only unlocking 100 rows to demonstrate --->
<cfset SpreadsheetFormatCellRange (sheet, {locked=false}, 1, 1, 100, 10)>
<!--- populate two cells --->
<cfset SpreadsheetSetCellValue(sheet,"LOCKED",1,1)>
<cfset SpreadsheetSetCellValue(sheet,"UNLOCKED",2,1)>
<!--- make one cell locked --->
<cfset SpreadsheetFormatCell(sheet, {locked=true}, 1, 1)>
<cfspreadsheet action="write"
name="sheet"
fileName="#testFile#"
password=""
overwrite="true" >
<!--- now see it is filled with empty cells --->
<cfspreadsheet action="read"
query="sheetData"
src="#testFile#" >
<cfdump var="#sheetData#" label="Lots of empty cells" />