一、 Excel输入概述
Excel输入是kettle中提供的一个数据抽取器,用于将Excel文件中的数据导入到kettle中进行处理。Excel数据源常被使用在各种报表生成、数据整理等场景中。Kettle在操作Excel文件时比较方便,支持多种格式的Excel导入,包括xls、xlsx、CSV等格式。
在使用Kettle进行Excel输入时,需要指定Excel文件的路径和Sheet页,还可以设置过滤器条件,筛选需要导入的数据。
//Kettle Excel输入代码示例 <job-entry> <name>Excel Input</name> <description>Reads values from an Excel file.</description> <type>ExcelInput</type> <filename>C:\data\test.xlsx</filename> <sheet>Sheet1</sheet> <header>Y</header> <noempty>N</noempty> <stop_on_empty>Y</stop_on_empty> </job-entry>
二、Excel导入过程中的数据类型转换
Excel文件中包含的数据类型是比较丰富的,kettle在进行转换时也考虑了这一点。Kettle将Excel输入字段分为以下四种类型:String、Integer、Number和Date,这四种类型可以涵盖Excel文件中大部分的数据类型。
在进行Excel数据类型转换时,需要注意一些细节问题,在转换时要注意中英文逗号、小数点等问题。此外,在使用Date类型时还需要注意日期格式的转换,kettle支持大部分常用日期格式。
//Excel输入中的数据类型转换代码示例 <fields> <field> <column_name>ID</column_name> <data_type>Integer</data_type> <date_format_reporting>YYYY/MM/dd</date_format_reporting> <ignore_change_of_length>N</ignore_change_of_length> <trim_type>none</trim_type> </field> <field> <column_name>Name</column_name> <data_type>String</data_type> <date_format_reporting>yyyy-MM-dd</date_format_reporting> <ignore_change_of_length>N</ignore_change_of_length> <trim_type>none</trim_type> </field> <field> <column_name>Price</column_name> <data_type>Number</data_type> <date_format_reporting></date_format_reporting> <ignore_change_of_length>N</ignore_change_of_length> <trim_type>none</trim_type> </field> <field> <column_name>Date</column_name> <data_type>Date</data_type> <date_format_reporting>YYYY-MM-DD HH:mm:ss</date_format_reporting> <locale>en_US</locale> <ignore_change_of_length>N</ignore_change_of_length> <trim_type>none</trim_type> </field> </fields>
三、Excel常见问题解决方法
在使用Excel输入时,会遇到一些常见问题,比如Excel中数据乱码、文件格式不兼容等问题。这时我们需要对Excel文件进行一些处理,以确保文件能够正常被导入。
对于数据乱码问题,可以使用Microsoft Office自带的“文本导入向导”功能进行处理。对于文件格式不兼容问题,可以将文件转换为更加普及的xlsx格式。
//Excel文件转换成xlsx格式代码示例 private static void convertToXlsx(File file) throws IOException { // 创建输入流 FileInputStream fis = new FileInputStream(file); // 读取XLS文件 HSSFWorkbook wb = new HSSFWorkbook(fis); // 输出XLSX文件 FileOutputStream fos = new FileOutputStream(new File("test.xlsx")); XSSFWorkbook xssfWorkbook = new XSSFWorkbook(); XSSFSheet xssfSheet = xssfWorkbook.createSheet("Sheet1"); int rowNum = 0; for (int i = 0; i < wb.getNumberOfSheets(); i++) { HSSFSheet hssfSheet = wb.getSheetAt(i); if (hssfSheet == null) { continue; } for (int j = 0; j <= hssfSheet.getLastRowNum(); j++) { HSSFRow hssfRow = hssfSheet.getRow(j); if (hssfRow == null) { continue; } XSSFRow xssfRow = xssfSheet.createRow(rowNum++); for (int k = 0; k < hssfRow.getLastCellNum(); k++) { HSSFCell hssfCell = hssfRow.getCell(k); if (hssfCell == null) { continue; } XSSFCell xssfCell = xssfRow.createCell(k); xssfCell.setCellValue(hssfCell.toString()); } } } xssfWorkbook.write(fos); fos.close(); }
四、Excel输入优化
当需要处理大量数据时,Excel输入会变得比较耗时。在这种情况下,我们可以进行一些优化,以提高Excel数据导入的效率。
首先,尽量缩小导入数据的范围,只导入需要的数据。其次,我们可以使用一些开源或商业的插件,如Pentaho Excel Input、Apache POI等,对Excel输入进行性能优化。此外,对于非常庞大的Excel文件,可以使用分块或分批次读入的方式进行处理。
//分块读取Excel文件代码示例 private static void readExcelByBlock(String fileName) throws IOException, InvalidFormatException { Workbook workbook = WorkbookFactory.create(new File(fileName)); Sheet sheet = workbook.getSheetAt(0); int rowStart = 1; //第一行是表头,所以从第二行开始读 int pageSize = 500; //每块读取500条数据 int totalRowNum = sheet.getLastRowNum() + 1;//getLastRowNum获取到的是最后一行的行标(索引),所以要加1 int pageNum = totalRowNum / pageSize + 1; //总共需要读取的块数 for (int pageIndex = 1; pageIndex <= pageNum; pageIndex++) {//分页读取 int endIndex = pageIndex * pageSize; if (endIndex > totalRowNum) { endIndex = totalRowNum; } for (int i = rowStart; i < endIndex; i++) {//读取一页的数据 Row row = sheet.getRow(i); if (row == null) { continue; } for (int j = 0; j < row.getLastCellNum(); j++) { Cell cell = row.getCell(j); if (cell == null) { continue; } System.out.print(cell); } System.out.println(); } rowStart = endIndex; } workbook.close(); }
五、Excel输入的注意事项
在使用Excel输入时,还需要注意以下几个问题:
1、Excel输入中如果存在空行,会直接跳过。
2、Excel输入中不支持动态变更Sheet页。
3、如果Excel文件被占用或者没有权限访问,会报错并退出任务。
4、Kettle内嵌了部分Pentaho BI components,这些组件和Kettle版本有关,有些组件可能不适用于某些Kettle版本。
六、总结
通过以上的阐述,我们可以总结出Excel输入的主要特点和使用方法。在使用Excel输入时,需要注意数据类型转换问题、常见问题的解决方法、性能优化等方面。如果能够熟练运用Excel输入,可以为各种数据处理、报表生成等场景提供优质的解决方案。