К сожалению, не используется cfspreadsheet
или встроенные функции электронных таблиц. Они возвращают только то, что отображается , а не базовые значения. Однако вы можете свернуть свой собственный, нажав на рабочую книгу POI .
Несколько вещей, которые нужно иметь в виду:
- В отличие от таблиц базы данных, столбцы электронной таблицы могут содержать сочетание типов данных. Тот факт, что первая ячейка содержит дату, не гарантирует, что все ячейки в этом столбце также содержат даты. Как и при любом импорте, не забудьте проверить все значения, прежде чем вставлять их в таблицу базы данных.
- Эти методы включают только заполненные строки и ячейки. Пустые строки и ячейки пропускаются. Поэтому значения столбцов не всегда являются смежными.
- Индексы листа, строки и столбца основаны на нуле (0)
Чтобы выполнить обработку, просто возьмите нужный лист и выполните итерации по строкам и ячейкам. Когда вы просматриваете столбцы, проверяете тип ячейки и извлекаете необработанное значение (то есть дату, строку, число, ...)
Источник: Руководство для занятых разработчиков по функциям HSSF и XSSF
<cfscript>
// get the sheet you want to read
cfSheet = SpreadSheetRead("c:/path/to/somefile.xls");
workbook = cfSheet.getWorkBook();
sheetIndex = workbook.getActiveSheetIndex();
sheet = workbook.getSheetAt( sheetIndex );
// utility used to distinguish between dates and numbers
dateUtil = createObject("java", "org.apache.poi.ss.usermodel.DateUtil");
// process the rows and columns
rows = sheet.rowIterator();
while (rows.hasNext()) {
currentRow = rows.next();
data = {};
cells = currentRow.cellIterator();
while (cells.hasNext()) {
currentCell = cells.next();
col = {};
col.value = "";
col.type = "";
col.column = currentCell.getColumnIndex()+ 1;
col.row = currentCell.getRowIndex()+ 1;
if (currentCell.getCellType() EQ currentCell.CELL_TYPE_STRING) {
col.value = currentCell.getRichStringCellValue().getString();
col.type = "string";
}
else if (currentCell.getCellType() EQ currentCell.CELL_TYPE_NUMERIC) {
if (DateUtil.isCellDateFormatted(currentCell)) {
col.value = currentCell.getDateCellValue();
col.type = "date";
}
else {
col.value = currentCell.getNumericCellValue();
col.type = "number";
}
}
else if (currentCell.getCellType() EQ currentCell.CELL_TYPE_BOOLEAN) {
col.value = currentCell.getBooleanCellValue();
col.type = "boolean";
}
// ... handle other types CELL_TYPE_BLANK, CELL_TYPE_ERROR, CELL_TYPE_FORMULA
data["COL"& col.column] = col;
}
// this row is finished. display all values
WriteDump(data);
}
</cfscript>