import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map; import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; /**
* @description Excel(.xlsx格式)导出通用工具类
* 1.该工具通过传入参数可以自定义行和列
* 2.该工具类时终端系统默认的通用导出格式,即文档标题,标题下方导出参数,表格表头,表格数据等
* 3.使用示例详见终端-我的权益计划-权益列表导出
* @date 2016-1-26
* @author ZhangLP
*/
public class ExcelExportUtil { /**************************************************方法说明start*******************************************************
* 导出excel主方法
* @param list 需要导出的数据list,对该list的要求:必须是一个Bean对象类型的list,Bean可以时任意一个
* @param requestmap 参数要求如下:
* 1.该map泛型为<String,Object><br>
* 2.该map中必须包含th,td,param,paramName以及若干其它值,示例如下:<br>
*
* ①表头标题,与下面的反射方法名个数及顺序一一对应(序号一项除外)用英文半角下划线隔开<br>
* map.put("th", "序号_频道_节目_品牌");<br>
*
* ②表格行所对应的实体反射方法名,必须与导出传入list中的实体get方法一致,用英文半角下划线隔开<br>
* map.put("td", "getChannelName_getProgramName_getTypeName");<br>
*
* ③表格表头上方查询参数数据获取字段定义,必须与上面1.导出参数中的名称一致,它将作为导出文档标题下方的条件,用英文半角下划线隔开<br>
* map.put("param", "channelName_programName_companyName_brandName");<br>
*
* ④表格表头上方查询参数字段标题,与③中的名称对应,作为③中数据的说明,它将作为导出文档下方的条件的说明,用英文半角下划线隔开<br>
* map.put("paramName", "频道:_节目:_厂商:_品牌:");<br>
*
* ⑤若干条件字段值,与③中的值对应<br>
* map.put("channelName","...");<br>
* map.put("programName","...");<br>
* map.put("companyName","...");<br>
* map.put("brandName","...");<br>
* @return 返回XSSFWorkbook对象,将用于转化输出流
*****************************************************方法说明end******************************************************/
public XSSFWorkbook exportExcel(List<? extends Object> list,Map<String,Object> requestmap) {
XSSFWorkbook wb = new XSSFWorkbook(); // 创建一个webbook
XSSFSheet sheet = wb.createSheet("sheet"); // 在webbook中添加一个sheet
XSSFRow row = null; // 在sheet中声明行
XSSFCell cell;
message(requestmap,wb,row,sheet); // 条件区处理
//标题行样式
XSSFCellStyle titleStyle=XExcelUtil.borderTitle(wb);
//内容行样式
XSSFCellStyle bodyStyle=XExcelUtil.borderBody(wb); //获取上一行行号
int lastNumber=sheet.getLastRowNum();
row = XExcelUtil.createHeightRow(sheet,lastNumber+1); //表头th
String th = (String)requestmap.get("th");
for(int i=0; i < th.split("_").length; i++) {
cell = row.createCell((int) i); // 列数
cell.setCellValue(th.split("_")[i]); // 列名称
cell.setCellStyle(titleStyle); // 列样式
} //表格行td
String td = (String)requestmap.get("td");
for(int i = 0; i < list.size(); i++) {
row = XExcelUtil.createHeightRow(sheet,(int) i + lastNumber+2);
row.createCell(0).setCellValue(i+1);//序号自增
try {
//循环填充每行的每个字段,根据传入的实体方法名反射得到list中的实体字段内容
Class<? extends Object> listClass = list.get(i).getClass();
for(int j = 0; j < td.split("_").length; j++){
row.createCell(j+1).setCellValue(listClass.getMethod(td.split("_")[j]).invoke(list.get(i))+"");
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} //循环填充样式
for(int k=0;k<row.getLastCellNum();k++){
row.getCell(k).setCellStyle(bodyStyle);
} }
//列宽自适应
for(int i=0; i < th.split("_").length; i++) {
sheet.autoSizeColumn(0, true);
sheet.autoSizeColumn(i, true);
}
return wb; } /**
* 头信息处理(title及条件区及部分样式)
* @param list
* @param requestmap
* @param wb
* @param row
* @param sheet
*/
private static void message(Map<String,Object> requestmap, XSSFWorkbook wb,XSSFRow row,XSSFSheet sheet){
sheet.setDisplayGridlines(false);//设置隐藏网格线 //最后一行行号
int lastNumber=0;
sheet.addMergedRegion(new CellRangeAddress(0, (short) 0, 0, (short) 1));//跨一行2列
//条件行样式
XSSFCellStyle conditionStyle=XExcelUtil.conditionCellStyle(wb); row = XExcelUtil.createHeightRow(sheet,0);
XSSFCell firstXSSFCell = row.createCell(0);
firstXSSFCell.setCellType(XSSFCell.CELL_TYPE_STRING);
firstXSSFCell.setCellValue(new XSSFRichTextString("XXXXX"));
firstXSSFCell.setCellStyle(XExcelUtil.companyCellStyle(wb));//设置单元格的样式 //条件key:通过它可以从map中获取条件名称,例如:湖南卫视
String param = (String)requestmap.get("param");
String[] paramArr = param.split("_");
//条件说明:例如:频道
String paramName = (String)requestmap.get("paramName");
String[] paramNameArr = paramName.split("_");
//循环条件写入条件区
for(int i = 0; i < paramArr.length; i ++){
lastNumber=sheet.getLastRowNum();
row = XExcelUtil.createHeightRow(sheet,lastNumber+1);
if(StringUtils.isNotEmpty((String)requestmap.get(paramArr[i]))){
row.createCell(0).setCellValue(paramNameArr[i]);
row.createCell(1).setCellValue((String)requestmap.get(paramArr[i]));
}else{
row.createCell(0).setCellValue(paramNameArr[i]);
row.createCell(1).setCellValue("无限制");
}
} //条件区与数据区空一行
lastNumber=sheet.getLastRowNum();
row = XExcelUtil.createHeightRow(sheet,lastNumber+1);
for(int i=1;i<sheet.getLastRowNum()+1;i++){
row=sheet.getRow(i);
for(int j=0;j<row.getLastCellNum();j++){
row.getCell(j).setCellStyle(conditionStyle);
}
} }
}

XExcelUtil工具类

    /** 设置excel的company title样式       */
public static XSSFCellStyle companyCellStyle(XSSFWorkbook wb) {
XSSFFont boldFont = wb.createFont();
boldFont.setFontHeight((short) 260);
boldFont.setFontName("微软雅黑");
XSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setFont(boldFont);
return cellStyle;
} /**
* excel (条件区黑体居左)
*/
public static XSSFCellStyle conditionCellStyle(XSSFWorkbook wb){
XSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT); // 左对齐
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中
XSSFFont boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setFontHeightInPoints((short) 10); //设置字体大小
cellStyle.setFont(boldFont);
return cellStyle;
} /**
* 数据表格标题样式:07版本
*/
public static CellStyle borderTitle(SXSSFWorkbook wb) {
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); // 下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);// 左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);// 上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);// 右边框
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中 Font boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); // 字体增粗
boldFont.setFontHeightInPoints((short) 10); // 设置字体大小
// boldFont.setColor(HSSFColor.WHITE.index);
cellStyle.setFont(boldFont);
return cellStyle;
} /**
* 数据表格数据区样式:07版本
*/
public static CellStyle borderBody(SXSSFWorkbook wb) {
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); // 下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);// 左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);// 上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);// 右边框
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中 Font boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setFontHeightInPoints((short) 10); // 设置字体大小
cellStyle.setFont(boldFont);
return cellStyle;
} /**
* 数据表格标题样式
*/
public static XSSFCellStyle borderTitle(XSSFWorkbook wb){
XSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中 XSSFFont boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); //字体增粗
boldFont.setFontHeightInPoints((short) 10); //设置字体大小
//boldFont.setColor(HSSFColor.WHITE.index); cellStyle.setFont(boldFont);
return cellStyle;
} /**
* 数据表格标题样式
*/
public static XSSFCellStyle borderTitleWeixin(XSSFWorkbook wb){
XSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中 cellStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
cellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.index);
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); XSSFFont boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); //字体增粗
boldFont.setFontHeightInPoints((short) 18); //设置字体大小
boldFont.setColor(IndexedColors.WHITE.index); cellStyle.setFont(boldFont);
return cellStyle;
} /**
* 数据来源样式
*/
public static XSSFCellStyle SourceBorder(XSSFWorkbook wb){
XSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
cellStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT); // 左右居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中 XSSFFont boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); //字体增粗
boldFont.setFontHeightInPoints((short) 10); //设置字体大小 cellStyle.setFont(boldFont);
return cellStyle;
} /**
* 数据来源样式
*/
public static XSSFCellStyle SourceBorderWeixin(XSSFWorkbook wb){
XSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
cellStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT); // 左右居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中 cellStyle.setFillBackgroundColor(IndexedColors.LIGHT_TURQUOISE.getIndex());
cellStyle.setFillForegroundColor(new XSSFColor( new Color(225, 245, 255)));
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); XSSFFont boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); //字体增粗
boldFont.setFontHeightInPoints((short) 18); //设置字体大小 cellStyle.setFont(boldFont);
return cellStyle;
}
/**
* 数据表格数据区样式
*/
public static XSSFCellStyle borderBody(XSSFWorkbook wb){
XSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中 XSSFFont boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setFontHeightInPoints((short) 10); //设置字体大小
cellStyle.setFont(boldFont);
return cellStyle;
} /**
* 数据表格数据区样式
*/
public static XSSFCellStyle borderBodyWeixin(XSSFWorkbook wb){
XSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 上下居中 //设置背景色
cellStyle.setFillBackgroundColor(IndexedColors.LIGHT_TURQUOISE.getIndex());
cellStyle.setFillForegroundColor(new XSSFColor( new Color(225, 245, 255)));
cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); XSSFFont boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setFontHeightInPoints((short) 18); //设置字体大小
cellStyle.setFont(boldFont);
return cellStyle;
} /**
* 大标题(居中)
* 软广栏目对比
*/
public static XSSFCellStyle styleBig(XSSFWorkbook wb) {
XSSFFont boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体增粗
boldFont.setFontHeightInPoints((short) 20);// 设置字体大小 XSSFCellStyle style = wb.createCellStyle();
style.setFont(boldFont);
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
style.setFillForegroundColor((short)7); style.setBorderBottom(XSSFCellStyle.BORDER_THIN); //下边框
style.setBorderLeft(XSSFCellStyle.BORDER_THIN);//左边框
style.setBorderTop(XSSFCellStyle.BORDER_THIN);//上边框
style.setBorderRight(XSSFCellStyle.BORDER_THIN);//右边框
return style;
} /**
* 小标题及条件(居左)
* 软广栏目对比
*/
public static XSSFCellStyle styleSmall(XSSFWorkbook wb) {
XSSFFont boldFont = wb.createFont();
boldFont.setFontName("微软雅黑");
boldFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字体增粗
boldFont.setFontHeightInPoints((short) 10);// 设置字体大小 XSSFCellStyle style = wb.createCellStyle();
style.setFont(boldFont);
style.setFillForegroundColor((short)7);
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
style.setAlignment(HSSFCellStyle.ALIGN_LEFT); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
return style;
} /**
* 创建行,并附行高
* (short)15.625 一个像素1px的值
*/
public static XSSFRow createHeightRow(XSSFSheet sheet,int rowNumber){
XSSFRow row=sheet.createRow(rowNumber);
row.setHeight((short)(27.25*20.00));
return row;
} /**
* 创建行,并附行高
* (short)15.625 一个像素1px的值
*/
public static XSSFRow createTitleHeightRow(XSSFSheet sheet,int rowNumber){
XSSFRow row=sheet.createRow(rowNumber);
row.setHeight((short)(48.625*20.00));
return row;
}

POI导出Excel文档通用工具方法的更多相关文章

  1. struts2中利用POI导出Excel文档并下载

    1.项目组负责人让我实现这个接口,因为以前做过类似的,中间并没有遇到什么太困难的事情.其他不说,先上代码: package com.tydic.eshop.action.feedback; impor ...

  2. Java之Poi导出Excel文档

    一.Poi简介 在后台管理系统中,我们经常要做的导出操作,通常导出为Excel文档的形式,而Poi则提供了这种需要的支持. 二.Workbook/HSSFWorkbook/XSSFWorkbook 1 ...

  3. 使用struts2和poi导出excel文档

    poi眼下应该是比較流行的操作excel的工具了.这几天做了个struts2和poi结合使用来实现导出excel的功能.个人认为还是比較有用的.代码阅读起来也非常easy.下来就来分享下我的心得 1  ...

  4. 转:ASP.NET MVC 将IList<T>导出Excel文档的泛型类

    /// <summary> /// 提供将泛型集合数据导出Excel文档. /// </summary> /// <typeparam name="T" ...

  5. PHP网页导出Word文档的方法分离

    今天要探讨的是PHP网页导出Word文档的方法,使用其他语言的朋友也可以参考,因为原理是差不多的. 原理 一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上 ...

  6. SpringBoot集成文件 - 如何使用POI导出Word文档?

    前文我们介绍了通过Apache POI导出excel,而Apache POI包含是操作Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API.所以 ...

  7. poi导出word文档,doc和docx

    maven <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency> <gro ...

  8. asp.net mvc4使用NPOI 数据处理之快速导出Excel文档

    一.背景 在之前做的小项目里有一需求是:要求将一活动录入的数据进行统计,并以excel表格形式导出来,并且对表格格式要求并不高. 二.问题分析 鉴于用户只要求最终将数据库中的数据导出excel,对于格 ...

  9. Asp.net中导出Excel文档(Gridview)

    主要思路,通过GridView来导出文档. 新建一个Aspx页面,页面创建GridView控件,后台绑定好数据源.然后load中直接打印即可导出 前台的GridView <asp:GridVie ...

随机推荐

  1. C#二进制字节数组操作功能 拦截字节数组SubByte

    C#二进制字节数组操作功能 拦截字节数组SubByte /// <summary> /// 截取字节数组 /// </summary> /// <param name=& ...

  2. HDU 2289 Cup(可以二分法,但是除了它的一半?)

    这道题目.运营商做数学题?算上两个子主题做?顶多算一个水主要议题... 首先,没有实际的二分法,但是,我们发现了一个新的解决方案,以取代二分法. 若果按照i从0,每次添加0.00000001我一直枚举 ...

  3. 复制(6)——分发者(Distributor)

    如简介中提到,分发者(Distributor)是SQLServer 复制过程的核心组件.因为它是控制和执行实际的数据移动的过程,并且存放了发布(Publications)和订阅(Subscriptio ...

  4. 【甘道夫】HBase连接池 -- HTablePool是Deprecated之后

    说明: 近期两天在调研HBase的连接池,有了一些收获,特此记录下来. 本文先将官方文档(http://hbase.apache.org/book.html)9.3.1.1节翻译,方便大家阅读,然后查 ...

  5. 使用shell命令分析统计日志

    用户需要登录统计信息,当分析用户行为,使用shell通常可以很容易地取出了大量的数据.删除,然后放入excel统计. 例如:统计日志含有loadCustomProcess这个地址的訪问,按訪问耗时排序 ...

  6. WiX Toolset

    原文:WiX Toolset 公司换软件打包平台,弄了一个月,Wix toolset的中文资料真的不多,逼着自己看了不少英文资料,终于弄懂了WiX打包的过程,做出了满足要求的安装包 一点基本概念:(F ...

  7. hibernate 单元測试框架

    hibernate在写数据库配置文件时很的不确定,必须进行必要的測试保证数据库结构的正确性.所以能够应用junit进行測试. 使用junit很easy,eclipse仅仅须要右键项目新建一个junit ...

  8. Java存储区域——JVM札记&lt;一个&gt;

    Java当虚拟机数据区域 执行数据区主要包括:方法区.堆.VM栈.本地方法栈.程序计数器. 当中方法区和栈是线程共享的区域,另外三块区域是每一个线程私有的区域.各个数据区的功能简单说明例如以下: 程序 ...

  9. asp.net学习之GridView事件、GridViewRow对象

    原文:asp.net学习之GridView事件.GridViewRow对象 1. GridView控件的事件 GridView有很多事件,事件可以定制控件的外观或者行为.事件分为三类     1.1 ...

  10. Swift使用单个案件管理FMDB数据库

    下班... 抢 我曾经Swift使用单一个案管理FMDB数据库的方法共享出来: // Created by 秦志伟 on 14-6-12. import UIKit class ZWDBManager ...