Question

Est-il possible d'obtenir le type de données ou le format d'une colonne ou d'une cellule dans une feuille de calcul lorsque vous la lisez en utilisant cfspreadsheet?

Je convertit les données de feuille de calcul d'une feuille de calcul Excel en une table de base de données. Jusqu'à présent, je formate tout comme Varchars, mais ce serait bien si je pouvais spécifier les dates comme des dates et des entiers que les entiers.

Était-ce utile?

La solution

Malheureusement, ne pas utiliser cfspreadsheet ou les fonctions de feuille de calcul intégrées. Ils ne retournent que ce qui est affiché, pas les valeurs sous-jacentes. Cependant, vous pouvez rouler le vôtre en tapant dans le POI sous-jacent cahier de travail.

Quelques choses à garder à l'esprit:

  • Contrairement aux tables de base de données, les colonnes de feuille de calcul peuvent contenir un mélange de types de données. Juste parce que la première cellule contient une date n'est pas une garantie tout Les cellules de cette colonne contiennent également des dates. Donc, comme pour toute importation, assurez-vous de valider toutes les valeurs avant de les insérer dans votre table de base de données.
  • Ces méthodes incluent uniquement peuplé lignes et cellules. Les lignes et les cellules vierges sont sautés. Les valeurs de colonne ne sont donc pas toujours contiguës.
  • Les index de feuille, de lignes et de colonnes sont basés sur zéro (0)

Pour faire le traitement, prenez simplement la feuille souhaitée et partez à travers les rangées et les cellules. Lorsque vous traversez les colonnes, vérifiez le type de cellule et extraire la valeur brute (c.-à-d. Date, chaîne, numéro, ...)

La source: Guide des développeurs occupés sur les fonctionnalités HSSF et 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top