Чтение формата столбца с помощью cfspreadsheet - PullRequest
2 голосов
/ 27 января 2012

Можно ли получить тип данных или формат столбца или ячейки в электронной таблице, когда вы читаете ее, используя cfspreadsheet?

Я преобразую данные электронной таблицы из таблицы Excel в таблицу базы данных. До сих пор я просто форматировал все как varchars, но было бы хорошо, если бы я мог указывать даты как даты, а целые числа как целые.

1 Ответ

3 голосов
/ 27 января 2012

К сожалению, не используется 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>
...