上述能修改为分为多个excel表格存储。每个表格存储2w行吗? 可以的话代码示例
时间: 2024-12-18 14:31:34 浏览: 15
当然可以。为了实现将大量数据分批导出到多个 Excel 表格中,每个表格存储 20,000 行数据,你可以对现有的 `exportDataToExcel` 方法进行修改。以下是修改后的代码示例:
```java
public void exportDataToExcel() {
Cursor cursor = db.query("BatteryData", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
int totalRows = cursor.getCount();
int rowsPerSheet = 20000;
int numFiles = (int) Math.ceil((double) totalRows / rowsPerSheet);
for (int fileIndex = 0; fileIndex < numFiles; fileIndex++) {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Battery Data");
// 创建表头
Row header = sheet.createRow(0);
header.createCell(0).setCellValue("SN");
header.createCell(1).setCellValue("Time");
header.createCell(2).setCellValue("Battery Level (%)");
header.createCell(3).setCellValue("Current (mA)");
header.createCell(4).setCellValue("Voltage (V)");
header.createCell(5).setCellValue("Temperature (°C)");
header.createCell(6).setCellValue("VBUS (µV)");
header.createCell(7).setCellValue("IBUS (µA)");
header.createCell(8).setCellValue("Rsoc");
header.createCell(9).setCellValue("Charge Type");
header.createCell(10).setCellValue("Charge Status");
header.createCell(11).setCellValue("Full_Capacity");
header.createCell(12).setCellValue("NTC_Temperature");
int startRow = fileIndex * rowsPerSheet;
int endRow = Math.min(startRow + rowsPerSheet, totalRows);
int rowNum = 1;
cursor.moveToPosition(startRow);
while (rowNum <= rowsPerSheet && cursor.moveToNext()) {
Row row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(cursor.getString(cursor.getColumnIndex("SN")));
row.createCell(1).setCellValue(cursor.getString(cursor.getColumnIndex("Time")));
row.createCell(2).setCellValue(cursor.getInt(cursor.getColumnIndex("Battery_Level")));
row.createCell(3).setCellValue(cursor.getDouble(cursor.getColumnIndex("Current")));
row.createCell(4).setCellValue(cursor.getDouble(cursor.getColumnIndex("Voltage")));
row.createCell(5).setCellValue(cursor.getDouble(cursor.getColumnIndex("Temperature")));
row.createCell(6).setCellValue(cursor.getString(cursor.getColumnIndex("VBUS")));
row.createCell(7).setCellValue(cursor.getString(cursor.getColumnIndex("IBUS")));
row.createCell(8).setCellValue(cursor.getString(cursor.getColumnIndex("Rsoc")));
row.createCell(9).setCellValue(cursor.getString(cursor.getColumnIndex("Charge_Type")));
row.createCell(10).setCellValue(cursor.getString(cursor.getColumnIndex("Charge_Status")));
row.createCell(11).setCellValue(cursor.getLong(cursor.getColumnIndex("Full_Capacity")));
row.createCell(12).setCellValue(cursor.getDouble(cursor.getColumnIndex("NTC_Temperature")));
}
try {
File file = createExcelFile("BatteryData_Part" + (fileIndex + 1) + "_" + getCurrentTimestamp() + ".xlsx");
FileOutputStream fileOutputStream = new FileOutputStream(file);
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
cursor.close();
}
private File createExcelFile(String fileName) throws IOException {
File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/BatteryData");
if (!dir.exists()) {
dir.mkdirs();
}
return new File(dir, fileName);
}
private String getCurrentTimestamp() {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
return dateFormat.format(new Date());
}
```
### 关键点解释:
1. **计算文件数量**:通过总行数除以每张表的最大行数(20,000),计算需要生成的文件数量。
2. **循环生成文件**:使用 `for` 循环遍历每个文件,每次处理最多 20,000 行数据。
3. **设置起始和结束位置**:在每次循环中,设置当前文件的数据起始位置和结束位置。
4. **移动游标**:使用 `cursor.moveToPosition(startRow)` 将游标移动到当前文件的起始位置。
5. **写入数据**:逐行读取并写入数据,直到达到该文件的最大行数或所有数据处理完毕。
6. **保存文件**:将每个文件保存到指定路径,并关闭工作簿和输出流。
这样,你就可以将大量数据分批导出到多个 Excel 文件中,每个文件存储不超过 20,000 行数据。
阅读全文