Java数据类型小计

1. Java的数据类型一共分为两大类:一类是基本数据类型;另一类是引用类型。

  • 基本数据类型包括:整型(byte,short,int,long),浮点型(float,double),字符型(char),boolean型。
  • 引用类型:除了基本数据类型意外的其它类型都是引用类型。
2. 整型数的范围:(整型数在Java里面以二进制补码的形式存在,范围如下)
  • byte           -128~127;
  • short          -32768~32767;
  • int              0x80000000~0x7fffffff

  • long           0x8000000000000000~0x7fffffffffffffff

3. Java里面,虽然有byte跟short类型,但是在运算的时候,默认都会补成32为的形式进行运算。即正数前面补零,负数前面补一。

4. int类型字面量,如果不超出范围,可以给小类型赋值。例如:0xffffffff 可以赋值给byte,因为它在byte跟int里面,都代表十进制数-1。但是0x80不可以,因为它在int里面代表十进制的128,但是byte的范围是-128~127,超出范围了。

5. Java里面运算的时候默认的数据类型是int型。

6. 浮点数分为单精度跟双精度:

  • 单精度浮点数float,占据32个二进制位,其中有一个是符号位,8个指数位,剩下23个位用来存放数据。

  • 双精度浮点数double,占据64个二进制位,其中有一个符号位,11个指数位,剩下52个位用来存放数据。

7. 整型数int占据32个位,1个符号位跟31个有效位。从这点可以看出,整型数的精确度比float型的精确度高。

8. 几个数据范围精确度的比较:

  • 按照精度(位数):float < int < double < long
  • 按照范围:int < long < float < double

上述比较是基于各个类型的边界条件而来的。

9. 浮点数的计算有时候也是不精确的,例如:2.6-2D 得出的结果肯定不是0.6。

10. 字符类型 char, 是一个16位无符号整数,是一个二进制数的数值,也是一个字符的unicode编码值。字符的字面量用单引号表示:‘中’   'A' 。

11. 将数字字符转换为对应的整数数字的方法为: X-'0'。 例如:'9'-'0'=9. 这样我们就可以算出字符0-9所对应的整数。

12. 转义字符:

  • '\0' ==\u0000==0 它是字符类型最小值,是不可见控制字符,是C语言中字符串结束字符!
  • '\t' tab;
  • '\n' next line;
  • '\r' 回车;
  • ....
  • 我们可以用'\u+4位16进制数'来表示字符。例如'\u0041'=='A'==65。
  • 不建议在字符串中出现'\0'.

转载于:https://my.oschina.net/javacy/blog/82603

<think>我们正在处理用户的问题:在Java中导出数据到Excel并实现小计功能。 根据用户需求,我们需要生成一个结构清晰的回答,并确保回答真实可靠。 我们将使用Apache POI库,因为它是最常用的Java库之一,用于处理Microsoft Office格式文件,包括Excel。 小计功能通常意味着在数据分组后,对每个组进行汇总(如求和、平均值等),并在每个组的末尾添加一行显示汇总结果。 步骤: 1. 创建Workbook和Sheet。 2. 创建数据行,并确保数据按某个字段分组(例如,部门、类别等)。 3. 在每组数据之后插入一行小计行,使用公式或直接计算值。 4. 在最后添加总计行。 注意:我们也可以使用POI的Sheet.addSubtotal方法(在XSSFSheet中)来添加小计,但这里我们将展示手动添加小计的方法,以便更灵活。 然而,Apache POI确实提供了一种内置的方法来创建小计:`sheet.groupRow`和`sheet.setRowGroupCollapsed`,以及使用`addSubtotalRow`(在较新版本中)。但为了清晰,我们将展示一个基本的手动实现。 由于用户没有指定分组字段和汇总字段,我们假设: - 数据按第一列(索引0)分组。 - 对第二列(索引1)和第三列(索引2)进行求和。 我们将创建一个示例: - 数据行:包括部门、销售额、成本等。 - 按部门分组,然后对销售额和成本进行小计,最后总计。 但是,请注意:如果数据量很大,我们可能需要先对数据进行排序(按分组字段),然后再添加小计行。 我们将按以下步骤编写代码: 1. 准备数据(这里我们使用一个二维数组模拟数据,实际中可能从数据库获取)。 2. 对数据按分组列进行排序(这里按第一列)。 3. 遍历数据,当分组列的值变化时,插入小计行。 4. 在最后插入总计行。 另外,我们也可以使用POI的`XSSFSheet`的`addSubtotal`方法,但该方法需要设置分组。我们将展示两种方式: 方式一:手动计算并插入小计行(更灵活,适用于各种需求) 方式二:使用POI内置的小计功能(更简单,但可能不够灵活) 由于用户要求小计功能,我们将重点放在手动方式上,因为这样更可控。 代码示例: 我们将使用: - Workbook: XSSFWorkbook (对应.xlsx格式) - 数据:假设有三列:部门、销售额、成本 步骤: 1. 创建Workbook和Sheet。 2. 创建标题行。 3. 准备数据列表(已按部门排序)。 4. 遍历数据,同时记录当前部门,当部门改变时,插入小计行(在上一个部门的最后一行后面)。 5. 在最后插入总计行。 注意:插入行时,需要将后面的行下移,因此我们可以先记录每个小计的位置,最后再插入。但更简单的方法是,我们可以在内存中构建好带有小计行的数据,然后一次性写入,这样避免在遍历时移动行。 因此,我们可以: - 先对原始数据进行分组,计算每个组的小计。 - 然后构建一个新的数据列表,包括原始数据行和插入的小计行。 - 最后将这个新的数据列表写入Excel。 这样避免在写入过程中移动行,更简单。 示例代码: 假设数据结构为: class DataRow { String department; double sales; double cost; } 我们使用一个List<DataRow>存储数据,然后按部门排序。 然后,我们构建一个新的列表(List<Object>),其中Object可以是原始数据行,也可以是一个小计行(用特殊对象表示,或者用字符串标识)。但为了简单,我们可以创建一个新的列表,元素类型为Object,然后遍历原始数据,当部门改变时,添加一个小计行(用字符串"Subtotal"标识,然后记录小计值)。 但是,在写入Excel时,我们需要知道每一行的具体值。因此,我们可以这样: 构建一个List<List<Object>>,每个元素是一行的数据(包括原始数据行和小计行)。 步骤: 1. 初始化一个空列表(newRows)用于存放最终要写入的所有行(包括小计行)。 2. 初始化当前部门变量为null,以及一个临时列表(currentGroup)存放当前组的行。 3. 遍历排序后的原始数据: - 如果当前部门为空,设置当前部门为第一个数据的部门。 - 如果当前数据的部门与当前部门相同,则将该行数据加入当前组(currentGroup),并继续。 - 否则,说明部门改变: a. 将当前组的所有行添加到newRows中。 b. 为当前组添加一个小计行(计算当前组的sales和cost总和),并添加到newRows。 c. 重置当前组,将当前数据加入作为新组的第一个数据,并更新当前部门。 4. 遍历结束后,将最后一个组的数据添加到newRows,并添加小计行。 5. 最后,添加总计行(计算所有小计行的总和,或者直接计算所有原始数据)。 然后,我们将newRows写入到Excel中。 这样,我们就有了一个包含小计行的数据列表。 接下来,我们编写代码。 注意:在写入小计行时,我们希望小计行在视觉上突出显示(例如,加粗,背景色等),所以我们将设置单元格样式。 另外,小计行通常放在每个分组的最后一行,并且小计行的分组字段列显示为“部门 Subtotal”或直接写“小计”。 我们开始写代码: 由于代码较长,我们将分步展示。</think>### Java中导出数据到Excel并实现小计功能 在Java中实现Excel数据导出和小计功能,推荐使用 **Apache POI** 库(处理.xlsx格式)或 **JExcelAPI**(处理.xls格式)。以下是分步实现方案: #### 1. 添加依赖 ```xml <!-- Maven 依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> ``` #### 2. 完整代码示例 ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.util.*; public class ExcelExporter { public static void main(String[] args) throws Exception { // 1. 模拟数据(部门, 销售额, 成本) List<Object[]> data = Arrays.asList( new Object[]{"市场部", 15000, 5000}, new Object[]{"市场部", 20000, 7000}, new Object[]{"技术部", 30000, 10000}, new Object[]{"技术部", 25000, 8000} ); // 2. 创建工作簿和Sheet try (Workbook workbook = new XSSFWorkbook()) { Sheet sheet = workbook.createSheet("销售报告"); // 3. 创建标题行 Row headerRow = sheet.createRow(0); String[] headers = {"部门", "销售额", "成本", "利润"}; for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); } // 4. 填充数据并计算利润 int rowNum = 1; Map<String, Double> subtotals = new LinkedHashMap<>(); // 存储小计 for (Object[] rowData : data) { Row row = sheet.createRow(rowNum++); String dept = (String) rowData[0]; double sales = (double) rowData[1]; double cost = (double) rowData[2]; double profit = sales - cost; // 写入数据 row.createCell(0).setCellValue(dept); row.createCell(1).setCellValue(sales); row.createCell(2).setCellValue(cost); row.createCell(3).setCellValue(profit); // 累加小计 subtotals.put(dept, subtotals.getOrDefault(dept, 0.0) + profit); } // 5. 添加小计行 CellStyle subtotalStyle = workbook.createCellStyle(); subtotalStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); subtotalStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); Font font = workbook.createFont(); font.setBold(true); subtotalStyle.setFont(font); for (Map.Entry<String, Double> entry : subtotals.entrySet()) { Row subtotalRow = sheet.createRow(rowNum++); Cell cell = subtotalRow.createCell(0); cell.setCellValue(entry.getKey() + " 小计"); cell.setCellStyle(subtotalStyle); subtotalRow.createCell(3).setCellValue(entry.getValue()); } // 6. 自动调整列宽 for (int i = 0; i < headers.length; i++) { sheet.autoSizeColumn(i); } // 7. 保存文件 try (FileOutputStream fos = new FileOutputStream("销售报告.xlsx")) { workbook.write(fos); } } System.out.println("Excel文件生成成功!"); } } ``` #### 关键功能说明 1. **数据分组小计**: - 使用 `Map<String, Double>` 按部门累计利润值 - 遍历Map在小计行显示汇总值 2. **样式设置**: - 小计行使用灰色背景和加粗字体 - `autoSizeColumn()` 自动调整列宽 3. **公式扩展**(如需): ```java // 添加公式计算(例如在总计行) Row totalRow = sheet.createRow(rowNum); totalRow.createCell(0).setCellValue("总计"); totalRow.createCell(3).setCellFormula("SUM(D2:D" + (rowNum-1) + ")"); ``` #### 高级优化建议 1. **大数据量处理**: - 使用 `SXSSFWorkbook` 替代 `XSSFWorkbook` 处理百万级数据 - 启用流式导出避免内存溢出: ```java SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 保留100行在内存 ``` 2. **模板引擎集成**: - 使用 `JXLS` 库基于Excel模板生成报告 - 支持复杂格式和公式预定义 3. **异步导出**: ```java CompletableFuture.runAsync(() -> { // 导出逻辑 }); ``` #### 注意事项 1. 数据排序:确保源数据按分组字段(如部门)排序 2. 类型安全:使用POI的 `DataFormatter` 正确处理数据类型 3. 内存管理:导出完成后调用 `workbook.dispose()`(SXSSF) > 此方案适用于业务报表、财务汇总等场景,实际应用中可结合Spring Boot实现RESTful导出接口[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值