利用java反射机制实现从数据库获取数据并导出到Excel并加密

本文介绍了一种使用Java从数据库导出数据到Excel的方法,并实现了文件加密功能。该方法通过反射机制获取不同类的数据字段,提高了代码的复用性和面向对象特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天我师傅让我写一个从数据库里的数据导出到Excel中并加密,开始我实现了只是用于一个类的,即一张表的方法,但是这样不符合Java的面向对象的思想,并且复用性太低,经过不断的研究实现,终于实现了不同的类/表均适用的方法,代码如下:

public class TestExcel {

	public  void encryptExportExcel(List<Map<String, Object>> list,String path,String[] title, String[] colum,Date oletime, Field[] fields) throws Exception {
            XSSFWorkbook wb = new XSSFWorkbook();
            XSSFSheet sheet1 = wb.createSheet("Rz_User");//自己命名
            XSSFRow row1 = sheet1.createRow(0);
           
            //设置表格样式
            XSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(XSSFCellStyle.ALIGN_CENTER);//水平居中
            style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);//垂直居中
        //  sheet1.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));合并
            //设置类变量的行
            for (int i = 0; i < title.length; i++) {
                sheet1.setColumnWidth(i,5000); //设置每列的宽,单位毫米
                XSSFCell cell = row1.createCell(i);
                cell.setCellValue(title[i]);
                cell.setCellStyle(style);
            }
            for (int i = 0; i < list.size(); i++) {
            	row1 = sheet1.createRow(i+1);   	
                	int k = 0;
                	//利用Java的反射机制顺序获取变量
                	for(Field field : fields) {
            			try {
            				field.setAccessible(true);
            				XSSFCell cell = row1.createCell(k);
            				cell.setCellValue(list.get(i).get(colum[i])==null?"":field.get(list.get(i).get(colum[i])).toString());;
            			    k++;
            			} catch (IllegalArgumentException e) {
            				e.printStackTrace();
            			}catch (IllegalAccessException e) {
            			    // TODO Auto-generated catch block
            			    e.printStackTrace();
            			   }
                }
            }
            
            FileOutputStream fileOut = new FileOutputStream(path);
            wb.write(fileOut);
            fileOut.close();
            POIFSFileSystem fs = new POIFSFileSystem();
            EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);
            Encryptor enc = info.getEncryptor();
            enc.confirmPassword("123456");//设置打开密码
            OPCPackage opc = OPCPackage.open(new File(path), PackageAccess.READ_WRITE);
            OutputStream os = enc.getDataStream(fs);
            opc.save(os);
            opc.close();
            FileOutputStream fos = new FileOutputStream(path);
            fs.writeFilesystem(fos);
            fos.close();
    }
}

        期间遇到的困难点是如何获取到类变量的值,如果想要适用于各个不同的类,显然是不能用set/get方法来获取的,故采用Java反射机制来获取即可,有点需要注意的是:field.setAccessible(true); 要设置为true,不然会报访问权限的错误。解决方法来自:https://blog.youkuaiyun.com/wangzai199701/article/details/78244082

        至于其他的代码块则主要是导出Excel并加密,网上都有,不懂的可以去搜索就行。

         下面是测试用的类:

public class TestExcelData {

	
	public static void main(String args[]) throws Exception{
		//假设从数据库里查出来的结果集
		List<TestExcelUser> list = new ArrayList<>();
		
		List<Map<String, Object>> list2 = new ArrayList<>();
		
		//假设数据
		TestExcelUser user = new TestExcelUser(1,"小明",18,new Date());
		TestExcelUser user1 = new TestExcelUser(2,"小刘",18,new Date());
		TestExcelUser user2 = new TestExcelUser(3,"小四",18,new Date());
		TestExcelUser user3 = new TestExcelUser(4,"小李",18,new Date());
		TestExcelUser user4 = new TestExcelUser(5,"小虎",18,new Date());
		TestExcelUser user5 = new TestExcelUser(6,"小傻",18,new Date());
		TestExcelUser user6 = new TestExcelUser(7,"小子",18,new Date());
		
		list.add(user);
		list.add(user1);
		list.add(user2);
		list.add(user3);
		list.add(user4);
		list.add(user5);
		list.add(user6);
		
		//这里是关键,将查出来的记录放在map中。
		Map<String, Object> map = new HashMap<>();
		//设一个数组里的值为key,其值对应一条记录
		String[] colum = new String[list.size()];
		for(int i = 0 ; i < list.size(); i++) {
			map.put(""+i, list.get(i));
			colum[i] = ""+i;
			list2.add(map);
		}

		//假设文件路径
		String  path = "C:\\Users\\admin\\Desktop\\rzjfforum.xlsx";
		//假设每列的名称
		String[] title = {"userid","username","age","time"};

		//假设一个过期的时间...用于当某些数据过久远时可以删除掉
		Date expriedTime = new Date();
		
		Field[] fields = TestExcelUser.class.getDeclaredFields();
		
        //调用上面类的方法
		TestExcel testExcel = new TestExcel();
		testExcel.encryptExportExcel(list2, path, title, colum,user.getTime(),fields);

	}
}

       这里主要是如何将不同的类/表的结果集传过去,这里就用到了List和Map的组合,将每一条记录存放到Map中,而key的值用一个字符串数组来存储,在将Map存放到List即可。其中涉及到的过期时间,可以暂不考虑。

SDS(SQL Data Security)是一款专门用于SQL数据库文件加密的保密软件。通过加密和访问控制技术,可控制SQL数据库文件无法拷贝,禁止导出,备份加密,远程销毁,脱离环境无法打开等等。 SDS分为管理程序和控制程序,需要在安装SQL Server数据库的机器上安装控制程序和管理程序,可在局域网内安装管理程序对SDS软件进行远程操控,安装后,所有数据库文件将处于加密状态,即使将文件拷贝出去也无法使用。同时,通过SQL企业管理器备份出来的数据也是加密的,离开本机环境将无法使用,SDS可禁止SQL组件导出数据。 SDS与数据库应用程序及数据库大小无关,后台实时监控数据的写入取,不会影响应用程序正常调用数据。 SDS的特点如下: 1.安装,维护简单。一键式安装,配套安装使用教程,专业的售后维护团队。 2.后台运行,实时监控数据库写。 3.数据库数据拷贝离开本机环境无法使用。本机环境内则不受影响。 4.与应用程序无关,不影响应用程序使用。ERP、PDM、等管理系统可以正常调用数据库文件,和正常操作一样。 5.与数据库大小无关。 6.通过设置,可本地或管理端临时禁用数据库。黑客来袭或者紧急情况可以通过本软件提供的禁用数据库功能使数据库文件无法打开,即使在本机环境依然无法正常打开使用,之后可恢复正常状态。 7.可设定云端验证。当服务器被盗时,可以是服务器电脑在本公司环境外部无法正常开机,卸载硬盘更换电脑依然无法正常开机,即数据库文件不会被外人获取。 SDS目前支持SQL2000、SQL2005、SQL2008、SQL2012。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值