`
microjava
  • 浏览: 321092 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java操作excel的综合应用(jxl)

阅读更多
根据excel模板生成excel报表文件--用于报表打印

jxl修改excel模板文件,实现动态数据分页打印

1.支持公式运算
2.支持对合并的单元格复制

package mcfeng.util.excel;

import java.io.File;
import java.io.IOException;

import jxl.CellType;
import jxl.Workbook;
import jxl.format.CellFormat;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import mcfeng.util.ExcelDataSource;
import mcfeng.util.MoneyUtil;
import mcfeng.util.StringUtil;

public class ExcelEditByModel {

	//list中取数据
	private final static String LIST_FLAG = "##";
	
	//map中取数据
	private final static String MAP_FLAG = "#&";
	
	//数字类型处理,支持公式
	private final static String NUM_FLAG = "#_&";
	
	//大写金额处理
	private final static String DX_FLAG = "##D&";

	public static void editExcel(int totalPage,String sourcefile, String targetfile) {
		File file1 = new File(sourcefile);
		File file2 = new File(targetfile);
		editExcel(totalPage,file1, file2);
	}

	public static void editExcel(int totalPage,File sourcefile, File targetfile) {
		String mycellValue = null;
		Workbook wb = null;
		try {
			// 构造Workbook(工作薄)对象
			wb = Workbook.getWorkbook(sourcefile);
		} catch (BiffException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		WritableWorkbook wwb = null;
		try {
			// 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象
			wwb = Workbook.createWorkbook(targetfile, wb);
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (wwb != null) {
			// 读取第一张工作表
			// Workbook的getSheet方法的参数,表示工作表在工作薄中的位置

			WritableSheet ws = wwb.getSheet(0);

			int scale = ws.getSettings().getScaleFactor();// 获取页面缩放比例
			
			int rowNum = ws.getRows();
			int colNum = ws.getColumns();
			
			//计算出每页行数
			int pageNum = rowNum/totalPage;

			for (int j = 0; j < rowNum; j++) {
				// 得到当前行的所有单元格

				//计算出取数据的位置
				int dataNum = j/pageNum;
				
				for (int k = 0; k < colNum; k++) {
					// 对每个单元格进行循环

					WritableCell mywc = ws.getWritableCell(k, j);

					System.out.println("mywc.getType(): " + mywc.getType());
					if (mywc.getType() == CellType.LABEL) {

						Label l = (Label) mywc;

						String cellValue = l.getContents();
						//处理后的值
						String opValue = null;
						
						System.out.println("cellValue: " + cellValue);

						// 处理excel单元格中#开头的字符串
						if (cellValue != null && cellValue.startsWith("#")) {

							if (cellValue.startsWith(LIST_FLAG)) {
								
								if(cellValue.startsWith(DX_FLAG))
								{
									opValue = cellValue.replaceAll(DX_FLAG, "");
								}
								else
								{
									opValue = cellValue.replaceAll(LIST_FLAG, "");
								}
								
								
								if (StringUtil.isNumeric(opValue)) {
									mycellValue = ExcelDataSource.getData(opValue,dataNum);
									if(cellValue.startsWith(DX_FLAG))
									{
										mycellValue = MoneyUtil.amountToChinese(mycellValue);
									}
									
								}

							} else if (cellValue.startsWith(MAP_FLAG)) {
								opValue = cellValue.replaceAll(MAP_FLAG, "");

								mycellValue = ExcelDataSource.getData(opValue,dataNum);
							}
							else if (cellValue.startsWith(NUM_FLAG)) {
								//支持公式运算
								opValue = cellValue.replaceAll(NUM_FLAG, "");

								mycellValue = ExcelDataSource.getData(opValue,dataNum);
								System.out.println("mycellValue: " + mycellValue);
								
								//获取字体,重新设置
								CellFormat wcff = mywc.getCellFormat();
								
								jxl.write.Number num = new jxl.write.Number(k,j,Double.valueOf(mycellValue),wcff);
								
								
								try {
									ws.addCell(num);
								} catch (RowsExceededException e) {
									
									e.printStackTrace();
								} catch (WriteException e) {
									
									e.printStackTrace();
								}
								continue;
							}
							l.setString(mycellValue);
						}
					}
				}
			}
			
			//设置页面缩放比例
			ws.getSettings().setScaleFactor(scale);

			try {
				// 写入 Excel 对象
				wwb.write();
				// 关闭可写入的 Excel 对象
				wwb.close();
				// 关闭只读的 Excel 对象
				wb.close();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (WriteException e) {
				e.printStackTrace();
			}

		}
	}

}



生成分页模板
package mcfeng.util.excel;

import java.io.File;
import java.io.IOException;

import jxl.Range;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.WritableCell;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class ExcelEditByModelPage {

	public static void editExceltoModel(int totalPage,String sourcefile, String targetfile) {
		File file1 = new File(sourcefile);
		File file2 = new File(targetfile);
		editExceltoModel(totalPage, file1,file2);
	}
	
	public static void editExcelbyModelPage(int totalPage,String sourcefile,String tempfile, String targetfile) {
		File file1 = new File(sourcefile);
		File file2 = new File(tempfile);
		File file3 = new File(targetfile);
		editExcelbyModelPage(totalPage, file1,file2,file3);
	}

	public static void editExcelbyModelPage(int totalPage, File sourcefile,File tempfile,
			File targetfile)
	{
		if(totalPage == 1)
		{
			ExcelEditByModel.editExcel(totalPage, sourcefile, targetfile);
			return;
		}
		//需要分页时,生成中间模板文件
		ExcelEditByModel.editExcel(totalPage,editExceltoModel(totalPage,sourcefile,tempfile), targetfile);
	}
	
	// 生成分页模板
	public static File editExceltoModel(int totalPage, File sourcefile,File targetfile) {
		
		Workbook wb = null;
		try {
			// 构造Workbook(工作薄)对象
			wb = Workbook.getWorkbook(sourcefile);
		} catch (BiffException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		WritableWorkbook wwb = null;
		try {
			// 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象
			wwb = Workbook.createWorkbook(targetfile, wb);
		} catch (IOException e) {
			e.printStackTrace();
		}

		if (wwb != null) {
			// 读取第一张工作表
			// Workbook的getSheet方法的参数,表示工作表在工作薄中的位置

			WritableSheet ws = wwb.getSheet(0);

			int scale = ws.getSettings().getScaleFactor();// 获取页面缩放比例

			int rowNum = ws.getRows();
			int colNum = ws.getColumns();

			System.out.println("rowNum: " + rowNum);
			System.out.println("colNum: " + colNum);
			
			//找出合并的单元格
			Range[] ranges = ws.getMergedCells();
			for(int rnum = 0;rnum < ranges.length;rnum++)
			{
				System.out.println("左上行数" + ranges[rnum].getTopLeft().getRow());
				System.out.println("左上列数" + ranges[rnum].getTopLeft().getColumn());
				System.out.println("右下行数" + ranges[rnum].getBottomRight().getRow());
				System.out.println("右下列数" + ranges[rnum].getBottomRight().getColumn());
			}

			int i = 1;
			while (i < totalPage) {

				for (int row = 0; row < rowNum; row++) {
					// 得到当前行的所有单元格

					for (int col = 0; col < colNum; col++) {
						// 对每个单元格进行循环
						// 复制单元格
						WritableCell cell = ws.getWritableCell(col, row)
								.copyTo(col, row + (rowNum*i));

						try {
							ws.addCell(cell);
						} catch (RowsExceededException e) {
							e.printStackTrace();
						} catch (WriteException e) {
							e.printStackTrace();
						}
					}
				}
				
				//按照模板合并单元格
				for(int rnum = 0;rnum < ranges.length;rnum++)
				{
					int lcol = ranges[rnum].getTopLeft().getColumn();
					int lrow = ranges[rnum].getTopLeft().getRow() + (rowNum*i);
					int rcol = ranges[rnum].getBottomRight().getColumn();
					int rrow = ranges[rnum].getBottomRight().getRow() + (rowNum*i);
					
					try {
						ws.mergeCells(lcol, lrow, rcol, rrow);
					} catch (RowsExceededException e) {
						
						e.printStackTrace();
					} catch (WriteException e) {
						
						e.printStackTrace();
					}
					
				}
				i++;
			}

			//设置页面缩放比例
			ws.getSettings().setScaleFactor(scale);
		}

		try {
			// 写入 Excel 对象
			wwb.write();
			// 关闭可写入的 Excel 对象
			wwb.close();
			// 关闭只读的 Excel 对象
			wb.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (WriteException e) {
			e.printStackTrace();
		}
		
		return targetfile;
	}
}

分享到:
评论

相关推荐

    jxl用于读取Excel的Java类(个人总结综合教程,适合新入门的朋友阅读)

    ### jxl库在Java中用于读取Excel的关键知识点解析 #### 一、jxl库简介与功能 jxl是Java Excel API的一个实现,主要用于...通过实践这些代码片段,你可以更深入地理解如何利用jxl库在Java应用中高效地操作Excel数据。

    POI与JXL的实战性能对比

    在日常工作中,尤其是在处理Excel文件时,我们通常会面临选择合适的Java库来完成任务的问题。JXL和POI是两个广泛使用的库,它们各有优势和局限性。 **JXL(JExcel API)** 是一个较早出现的库,主要适用于处理早期...

    java与jxl、log4j综合运用例子

    这个综合运用例子对于学习如何在实际项目中结合使用Java、JXL和Log4j非常有帮助。通过实践,开发者可以更好地理解这些工具的功能和它们在协同工作时的潜力。同时,这样的例子也可以作为模板,帮助其他开发者快速构建...

    struts2 poi,jxl向excel表中插入记录源代码

    在早期的Java应用中,JXL是常见的选择,不过随着POI的发展,现在更多地被用于复杂的Excel操作。 这个项目的核心功能是允许用户通过前端界面提交数据,然后这些数据会被Struts2的Action处理,并使用POI或JXL库写入到...

    Java导出Excel

    Java导出Excel是一个综合性的技术点,涉及数据库查询、数据处理、文件操作等多个方面。通过合理选择和配置相关库,结合有效的数据处理策略,可以实现在各种场景下高效、准确地导出Excel文件。在具体实践中,还需注意...

    java导入导出excel(自己的例子)

    综合以上,通过Apache POI和JExcelAPI,我们可以方便地在Java应用程序中处理Excel文件的导入和导出。同时,结合Apache Commons FileUpload,我们可以实现文件上传功能,从而让用户上传Excel文件供程序进一步处理。...

    很好用的jxl.jar

    jxl不仅支持基本的读写操作,还包括单元格样式设置、公式处理、图表操作等特性,使得Java开发者无需直接操作Excel应用程序,就能在程序中处理Excel数据。 然而,压缩包子文件的文件名称列表包含的是:"jquery-ui.js...

    java读xls文件成shell脚本

    Java中处理Excel文件通常使用第三方库,如Apache POI或jxl。这里提到的`jxl.jar`就是jxl库,它允许我们读取、写入和修改Excel文件。jxl库支持.xls格式,即Excel 97-2007的文件格式。 2. **jxl库的使用**: - **导...

    Java实训方案之操作Execel表格.docx

    - 掌握jxl操作Excel文件的基本原理。 - 掌握如何在Excel文件中写入数据。 - 掌握如何从Excel文件中读取数据。 这些目标旨在使学生能够独立完成简单的Excel文件操作任务,并为进一步学习更高级的数据处理技巧打下...

    Java_Web开发实战1200例第1卷.part3

    21.1 应用JXL组件操作Excel 776 21.2 应用POI组件操作Excel 807 第22章 报表与打印 829 22.1 Web打印 830 22.2 利用Word打印报表 833 22.3 利用Excel打印报表 838 22.4 应用WebBrowser+CSS套打邮寄 22.5 打印库存...

    Java_Web开发实战1200例第1卷.part2

    21.1 应用JXL组件操作Excel 776 21.2 应用POI组件操作Excel 807 第22章 报表与打印 829 22.1 Web打印 830 22.2 利用Word打印报表 833 22.3 利用Excel打印报表 838 22.4 应用WebBrowser+CSS套打邮寄 22.5 打印库存...

    网上银行系统Struts+hibernate+jxl

    再者,jxl是一个用于读写Excel文件的Java库,它在本项目中被用来实现工资代发功能。在银行系统中,批量处理员工工资发放是常见的业务需求,jxl库允许程序动态生成或读取Excel工作簿,创建工资表,自动计算各项福利,...

    jsp导excel到mysql

    ### jsp导excel到mysql:综合知识解析 在IT领域,特别是Web开发中,数据迁移与处理是一项常见的任务。从给定的文件标题、描述、...这些技术的综合应用,可以高效地实现数据迁移任务,是Web开发中不可或缺的技能之一。

    jxls需要的jar包.rar

    通过这些库,开发者可以方便地在Java应用程序中进行Excel数据的导入、导出和复杂操作,提高了工作效率并降低了与Excel交互的复杂性。这些库的使用不仅简化了代码,还使得项目更易于维护和扩展。

    非常经典java求职简历三套含项目介绍.docx

    开发者利用 Struts、Spring 和 Hibernate 实现了系统的业务逻辑,同时利用 Jxl 进行 Excel 操作,增强了系统的功能。 - **成都敬业房产公司会员管理系统**:这个系统分为前台和后台,开发者使用了类似的技术栈,...

    企业信息管理系统

    总的来说,企业信息管理系统是一个集成了多种先进技术和工具的综合性平台,它利用JSP和Java的强大功能,结合Ajax提高交互性,通过javamail、DisplayTag、jxl和poi处理数据展示和导出,以及生成定制的Word报告,以...

    随机点名小系统

    综合以上,这个随机点名小系统是一个集成了Java编程、数据库操作、数据处理和用户友好界面的综合应用,它展示了Java在教育领域中的实际应用。通过理解这些知识点,不仅可以了解该系统的运作方式,也能为类似项目的...

    POI打印全面经典资料.zip

    这个"POI打印全面经典资料.zip"压缩包显然包含了一系列关于如何使用POI库进行Excel操作的重要资源,包括JXL API和POI API的文档、教程以及一些综合性的POI使用案例。以下是对这些知识点的详细说明: 1. **JXL API**...

    客户信息管理系统

    在功能实现上,“导出信息表”功能允许用户将客户信息导出为文件,这可能是通过读取数据库中的数据,然后利用jxl-2.6.12.jar库将数据写入Excel文件,方便用户进行数据分析或备份。"修改"和"添加"功能则涉及到数据库...

Global site tag (gtag.js) - Google Analytics