- 浏览: 24109 次
- 性别:
- 来自: 广州
-
最新评论
-
Wuaner:
<div class="quote_t ...
导出数据到Excel表中--用Apache的POI实现简单封装 -
ilove2009:
<div class="quote_t ...
导出数据到Excel表中--用Apache的POI实现简单封装 -
qtalen:
<div class="quote_t ...
导出数据到Excel表中--用Apache的POI实现简单封装 -
qtalen:
<p>LZ好,你这个挺好用的,不过 ...
导出数据到Excel表中--用Apache的POI实现简单封装 -
studyoo:
是POI不是PIO。
导出数据到Excel表中--用Apache的POI实现简单封装
使用Apache的POI 实现对数据导出到EXCEL表中进行了一个简单的封装,可以通过XML配置文件配置你想导出的信息,以下是这个小工具的代码:
DataImportAndExportTool.java 代码:
MethodTool.java 代码:
现在做一个测试:
下面是一个hibernate 实体映射类
只要在classPath下建一个文件:
里面配置你想导出的字段
Medicine.xml
就可以导出数据了:
以下是导出数据到EXCEL的应用;
这样就可以一个Excel表了
DataImportAndExportTool.java 代码:
package nhu.drugstore.uitl; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class DataImportAndExportTool { private class Entiy { String name; String text; String type; } private static DataImportAndExportTool tool=new DataImportAndExportTool(); /** * 空的构造方法 */ private DataImportAndExportTool() { //do nothing } /** * * 以一个数组方式创建一个标题行 * @param row * @param title */ private void createTitleRow(HSSFWorkbook workbook,HSSFRow row,String[] title) { int length=title.length; HSSFCellStyle style=workbook.createCellStyle(); HSSFFont font=workbook.createFont(); font.setColor(HSSFColor.BLUE.index); font.setFontHeightInPoints((short)14); font.setBoldweight((short)24); style.setFont(font); style.setFillBackgroundColor(HSSFColor.YELLOW.index); for(int i=0;i<length;i++) { HSSFCell cell=row.createCell(i); cell.setCellValue(title); cell.setCellStyle(style); } } /** * 解析XML文件 * @param className * @return * @throws ParserConfigurationException * @throws IOException * @throws SAXException */ private List<Entiy> parseXML(String className) throws Exception { List<Entiy> list=new ArrayList<Entiy>(); Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(this.getClass().getClassLoader().getResourceAsStream("/"+className+".xml")); NodeList nodeList=doc.getElementsByTagName("property"); Element element; for(int i=0;i<nodeList.getLength();i++) { element=(Element)nodeList.item(i); Entiy e=new Entiy(); e.name=element.getAttribute("name"); e.text=element.getAttribute("text"); e.type=element.getAttribute("type"); list.add(e); } return list; } /** * 创建工作表的标题行 * @param workbook * @param row * @param list */ private void createTitleRow(HSSFWorkbook workbook,HSSFRow row,List<Entiy> list) { HSSFCellStyle style=workbook.createCellStyle(); HSSFFont font=workbook.createFont(); font.setColor(HSSFColor.BLUE.index); font.setFontHeightInPoints((short)14); font.setBoldweight((short)24); style.setFont(font); style.setFillBackgroundColor(HSSFColor.YELLOW.index); int i=0; for(Entiy e:list) { HSSFCell cell=row.createCell(i++); cell.setCellValue(e.text); cell.setCellStyle(style); } } /** * 从一个列表中创建出一个工作空间 * @param list * @param sheetName * @return * @throws Exception */ public static HSSFWorkbook ExportToExcel(List list,String sheetName) throws Exception { Class c=list.get(0).getClass(); String className=c.getSimpleName(); //解析XML文件中的信息到一个列表中 List<Entiy> entiyList=tool.parseXML(className); //创建一个空工作空间 HSSFWorkbook workbook=new HSSFWorkbook(); //创建一个表 HSSFSheet sheet=workbook.createSheet(sheetName); //创建标题行 HSSFRow titleRow=sheet.createRow(0); tool.createTitleRow(workbook, titleRow,entiyList); /* * 创建表中的信息 */ int rowNum=1; for(int i=0;i<list.size();i++) { HSSFRow row=sheet.createRow(rowNum++); int colNum=0; for(Entiy e:entiyList) { if(e.type.endsWith("String")) { row.createCell(colNum++).setCellValue((String)MethodTool.excuteMethod(list.get(i),MethodTool.returnGetMethodName(e.name))); } else if("int".equals(e.type)||"java.lang.Integer".equals(e.type)) { row.createCell(colNum++).setCellValue((Integer)MethodTool.excuteMethod(list.get(i),MethodTool.returnGetMethodName(e.name))); } else if("double".equals(e.type)||"java.lang.Double".equals(e.type)) { row.createCell(colNum++).setCellValue((Double)MethodTool.excuteMethod(list.get(i),MethodTool.returnGetMethodName(e.name))); } else if(e.type.endsWith("Date")) { row.createCell(colNum++).setCellValue((Date)MethodTool.excuteMethod(list.get(i),MethodTool.returnGetMethodName(e.name))); } else if(e.type.endsWith("Calendar")) { row.createCell(colNum++).setCellValue((Calendar)MethodTool.excuteMethod(list.get(i),MethodTool.returnGetMethodName(e.name))); } else if("boolean".equals(e.type)||"java.lang.Boolean".equals(e.type)) { row.createCell(colNum++).setCellValue((Double)MethodTool.excuteMethod(list.get(i),MethodTool.returnGetMethodName(e.name))); } else { throw new Exception("数据类型错误"); } } } return workbook; } }
MethodTool.java 代码:
package nhu.drugstore.uitl; import java.lang.reflect.Method; /** * 这是一个用于方法反射的工具类 * 这将运用JDK的反射机制 * @author strive * */ public class MethodTool { /** * 反转一个有返回值的无参方法 * @param object * @param methodName * @return * @throws Exception */ public static Object excuteMethod(Object object,String methodName) throws Exception { Class c=object.getClass(); Method m=c.getMethod(methodName); return m.invoke(object); } /** * 反转一个没有返回值的有一个参数的方法 * @param object * @param methodName * @param parameter * @throws Exception */ public static void excuteMethod(Object object,String methodName,Object parameter) throws Exception { Class c=object.getClass(); Method m=c.getDeclaredMethod(methodName, parameter.getClass()); m.invoke(object,parameter); } /** * 执行一个参数为boolean类型的方法 * @param object * @param methodName * @param parameter * @throws Exception */ public static void excuteBoolMethod(Object object,String methodName,boolean parameter) throws Exception { Class c=object.getClass(); Method m=c.getDeclaredMethod(methodName,boolean.class); m.invoke(object,parameter); } /** * 获得一个属性的set方法名 * @param property * @return */ public static String returnSetMethodName(String property) { return "set"+Character.toUpperCase(property.charAt(0))+property.substring(1); } /** * 获得一个属性的get方法名 * @param property * @return */ public static String returnGetMethodName(String property) { return "get"+Character.toUpperCase(property.charAt(0))+property.substring(1); } }
现在做一个测试:
下面是一个hibernate 实体映射类
/ package nhu.drugstore.bean; /** * this is a class description a model of Medicine * only some geter and seter method * @author strive * @hibernate.class */ public class Medicine { /** * 主键 * @hibernate.id generator-class="native" */ private int id; /** * 药品名称 * @hibernate.property * unique="true" */ private String name; /** * 放药药框 * @hibernate.property */ private String ark; /** * 条形码 * @hibernate.property * */ private String barCode; /** * 功效描述 * @hibernate.property */ private String efficacy; /** * 进货价格 * @hibernate.property */ private double buyPrice; /** * 出售价格 * @hibernate.property */ private double sellPrice; /** * 库存量 * @hibernate.property */ private double stockpile; /** * 库存不足提示数量 * @hibernate.property */ private double cueNumber; /** * 打折百分比 * @hibernate.property */ private double rebate; /** * 提成百分比 * @hibernate.property */ private double rakeOff; /** * 拼音简查码 * @hibernate.property */ private String spellShort; /** * 数字简查码 * @hibernate.property */ private String numberShort; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getArk() { return ark; } public void setArk(String ark) { this.ark = ark; } public String getBarCode() { return barCode; } public void setBarCode(String barCode) { this.barCode = barCode; } public String getEfficacy() { return efficacy; } public void setEfficacy(String efficacy) { this.efficacy = efficacy; } public double getBuyPrice() { return buyPrice; } public void setBuyPrice(double buyPrice) { this.buyPrice = buyPrice; } public double getSellPrice() { return sellPrice; } public void setSellPrice(double sellPrice) { this.sellPrice = sellPrice; } public double getStockpile() { return stockpile; } public void setStockpile(double stockpile) { this.stockpile = stockpile; } public double getCueNumber() { return cueNumber; } public void setCueNumber(double cueNumber) { this.cueNumber = cueNumber; } public double getRebate() { return rebate; } public void setRebate(double rebate) { this.rebate = rebate; } public double getRakeOff() { return rakeOff; } public void setRakeOff(double rakeOff) { this.rakeOff = rakeOff; } public String getSpellShort() { return spellShort; } public void setSpellShort(String spellShort) { this.spellShort = spellShort; } public String getNumberShort() { return numberShort; } public void setNumberShort(String numberShort) { this.numberShort = numberShort; } }
只要在classPath下建一个文件:
里面配置你想导出的字段
Medicine.xml
<?xml version="1.0" encoding="UTF-8"?> <bean class="nhu.drugstore.bean.Medicine"> <property name="name" text="药品名称" type="String"/> <property name="ark" text="放药药框" type="String"/> <property name="barCode" text="条形码" type="String"/> <property name="buyPrice" text="进货价格" type="double"/> <property name="stockpile" text="库存量" type="double"/> <property name="sellPrice" text="出售价格" type="double"/> <property name="rebate" text="打折百分比" type="double"/> <property name="efficacy" text="功效描述" type="String"/> </bean>
就可以导出数据了:
以下是导出数据到EXCEL的应用;
File outputFile=new File("C:/"); OutputStream fOut = new PrintStream(outputFile); // 把相应的Excel 工作簿存盘 DataImportAndExportTool.ExportToExcel(medicineDao.getAllMedicine(),"药材信息表").write(fOut); fOut.flush(); // 操作结束,关闭文件 fOut.close();
这样就可以一个Excel表了
评论
5 楼
Wuaner
2010-07-14
<div class="quote_title">ilove2009 写道</div>
<div class="quote_div">
<div class="quote_title">qtalen 写道</div>
<div class="quote_div">
<div class="quote_title">qtalen 写道</div>
<div class="quote_div">
<p>LZ好,你这个挺好用的,不过我在项目搞了一些改造:</p>
<p>首先加了一个annotation:</p>
<pre name="code" class="java">@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Cell {
/**
* 该字段对应的表格头
*/
public String title();
}</pre>
<p> 接着在ExportTool里增加一个方法来解析annotation:</p>
<pre name="code" class="java">/**
* 解析出元数据信息,初始化excel导出
*
* @param className
* @return
* @throws ClassNotFoundException
*/
private List<Entity> parseAnnotation(Class clazz)
throws ClassNotFoundException {
List<Entity> entities = new ArrayList<Entity>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Entity e = new Entity();
boolean hasAnnotation = field.isAnnotationPresent(Cell.class);
if (hasAnnotation) {
Cell annotation = field.getAnnotation(Cell.class);
e.title = annotation.title();
e.type = field.getType().getName();
e.name = field.getName();
entities.add(e);
}
}
return entities;
}</pre>
<p> 其他的变动不大,对于需要导出的值对象,用annotation标注一下就可以了:</p>
<pre name="code" class="java">public class Student {
@Cell(title = "学号")
private long serialNumber;
@Cell(title = "姓名")
private String name;
@Cell(title = "性别")
private String sexual;
@Cell(title = "分数")
private Long score;
…
}
</pre>
<p> </p>
<p> </p>
<p> </p>
</div>
<br>就是不知道这么大量的使用反射会不会性能有问题</div>
<p><br>1、把配置写到java里,要是需求改变,是不是重新编译代码</p>
<p>2、to LZ:如果用户对数据格式有要求,不如日期有yyyyMMdd或者yyyy-MM-dd不同需要,好像不能满足。</p>
</div>
<p> </p>
<p> </p>
<p>使用注解的方式确实得重新编译,这点比不上使用xml的方式啊;</p>
<p>日期的格式,为方法多加个日期格式的参数,呵呵。</p>
<div class="quote_div">
<div class="quote_title">qtalen 写道</div>
<div class="quote_div">
<div class="quote_title">qtalen 写道</div>
<div class="quote_div">
<p>LZ好,你这个挺好用的,不过我在项目搞了一些改造:</p>
<p>首先加了一个annotation:</p>
<pre name="code" class="java">@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Cell {
/**
* 该字段对应的表格头
*/
public String title();
}</pre>
<p> 接着在ExportTool里增加一个方法来解析annotation:</p>
<pre name="code" class="java">/**
* 解析出元数据信息,初始化excel导出
*
* @param className
* @return
* @throws ClassNotFoundException
*/
private List<Entity> parseAnnotation(Class clazz)
throws ClassNotFoundException {
List<Entity> entities = new ArrayList<Entity>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Entity e = new Entity();
boolean hasAnnotation = field.isAnnotationPresent(Cell.class);
if (hasAnnotation) {
Cell annotation = field.getAnnotation(Cell.class);
e.title = annotation.title();
e.type = field.getType().getName();
e.name = field.getName();
entities.add(e);
}
}
return entities;
}</pre>
<p> 其他的变动不大,对于需要导出的值对象,用annotation标注一下就可以了:</p>
<pre name="code" class="java">public class Student {
@Cell(title = "学号")
private long serialNumber;
@Cell(title = "姓名")
private String name;
@Cell(title = "性别")
private String sexual;
@Cell(title = "分数")
private Long score;
…
}
</pre>
<p> </p>
<p> </p>
<p> </p>
</div>
<br>就是不知道这么大量的使用反射会不会性能有问题</div>
<p><br>1、把配置写到java里,要是需求改变,是不是重新编译代码</p>
<p>2、to LZ:如果用户对数据格式有要求,不如日期有yyyyMMdd或者yyyy-MM-dd不同需要,好像不能满足。</p>
</div>
<p> </p>
<p> </p>
<p>使用注解的方式确实得重新编译,这点比不上使用xml的方式啊;</p>
<p>日期的格式,为方法多加个日期格式的参数,呵呵。</p>
4 楼
ilove2009
2010-01-04
<div class="quote_title">qtalen 写道</div>
<div class="quote_div">
<div class="quote_title">qtalen 写道</div>
<div class="quote_div">
<p>LZ好,你这个挺好用的,不过我在项目搞了一些改造:</p>
<p>首先加了一个annotation:</p>
<pre name="code" class="java">@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Cell {
/**
* 该字段对应的表格头
*/
public String title();
}</pre>
<p> 接着在ExportTool里增加一个方法来解析annotation:</p>
<pre name="code" class="java">/**
* 解析出元数据信息,初始化excel导出
*
* @param className
* @return
* @throws ClassNotFoundException
*/
private List<Entity> parseAnnotation(Class clazz)
throws ClassNotFoundException {
List<Entity> entities = new ArrayList<Entity>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Entity e = new Entity();
boolean hasAnnotation = field.isAnnotationPresent(Cell.class);
if (hasAnnotation) {
Cell annotation = field.getAnnotation(Cell.class);
e.title = annotation.title();
e.type = field.getType().getName();
e.name = field.getName();
entities.add(e);
}
}
return entities;
}</pre>
<p> 其他的变动不大,对于需要导出的值对象,用annotation标注一下就可以了:</p>
<pre name="code" class="java">public class Student {
@Cell(title = "学号")
private long serialNumber;
@Cell(title = "姓名")
private String name;
@Cell(title = "性别")
private String sexual;
@Cell(title = "分数")
private Long score;
…
}
</pre>
<p> </p>
<p> </p>
<p> </p>
</div>
<br>就是不知道这么大量的使用反射会不会性能有问题</div>
<p><br>1、把配置写到java里,要是需求改变,是不是重新编译代码</p>
<p>2、to LZ:如果用户对数据格式有要求,不如日期有yyyyMMdd或者yyyy-MM-dd不同需要,好像不能满足。</p>
<div class="quote_div">
<div class="quote_title">qtalen 写道</div>
<div class="quote_div">
<p>LZ好,你这个挺好用的,不过我在项目搞了一些改造:</p>
<p>首先加了一个annotation:</p>
<pre name="code" class="java">@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Cell {
/**
* 该字段对应的表格头
*/
public String title();
}</pre>
<p> 接着在ExportTool里增加一个方法来解析annotation:</p>
<pre name="code" class="java">/**
* 解析出元数据信息,初始化excel导出
*
* @param className
* @return
* @throws ClassNotFoundException
*/
private List<Entity> parseAnnotation(Class clazz)
throws ClassNotFoundException {
List<Entity> entities = new ArrayList<Entity>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Entity e = new Entity();
boolean hasAnnotation = field.isAnnotationPresent(Cell.class);
if (hasAnnotation) {
Cell annotation = field.getAnnotation(Cell.class);
e.title = annotation.title();
e.type = field.getType().getName();
e.name = field.getName();
entities.add(e);
}
}
return entities;
}</pre>
<p> 其他的变动不大,对于需要导出的值对象,用annotation标注一下就可以了:</p>
<pre name="code" class="java">public class Student {
@Cell(title = "学号")
private long serialNumber;
@Cell(title = "姓名")
private String name;
@Cell(title = "性别")
private String sexual;
@Cell(title = "分数")
private Long score;
…
}
</pre>
<p> </p>
<p> </p>
<p> </p>
</div>
<br>就是不知道这么大量的使用反射会不会性能有问题</div>
<p><br>1、把配置写到java里,要是需求改变,是不是重新编译代码</p>
<p>2、to LZ:如果用户对数据格式有要求,不如日期有yyyyMMdd或者yyyy-MM-dd不同需要,好像不能满足。</p>
3 楼
qtalen
2010-01-04
<div class="quote_title">qtalen 写道</div><div class="quote_div"><p>LZ好,你这个挺好用的,不过我在项目搞了一些改造:</p>
<p>首先加了一个annotation:</p>
<pre name="code" class="java">@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Cell {
/**
* 该字段对应的表格头
*/
public String title();
}</pre>
<p> 接着在ExportTool里增加一个方法来解析annotation:</p>
<pre name="code" class="java">/**
* 解析出元数据信息,初始化excel导出
*
* @param className
* @return
* @throws ClassNotFoundException
*/
private List<Entity> parseAnnotation(Class clazz)
throws ClassNotFoundException {
List<Entity> entities = new ArrayList<Entity>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Entity e = new Entity();
boolean hasAnnotation = field.isAnnotationPresent(Cell.class);
if (hasAnnotation) {
Cell annotation = field.getAnnotation(Cell.class);
e.title = annotation.title();
e.type = field.getType().getName();
e.name = field.getName();
entities.add(e);
}
}
return entities;
}</pre>
<p> 其他的变动不大,对于需要导出的值对象,用annotation标注一下就可以了:</p>
<pre name="code" class="java">public class Student {
@Cell(title = "学号")
private long serialNumber;
@Cell(title = "姓名")
private String name;
@Cell(title = "性别")
private String sexual;
@Cell(title = "分数")
private Long score;
…
}
</pre>
<p> </p>
<p> </p>
<p> </p></div><br/>就是不知道这么大量的使用反射会不会性能有问题
<p>首先加了一个annotation:</p>
<pre name="code" class="java">@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Cell {
/**
* 该字段对应的表格头
*/
public String title();
}</pre>
<p> 接着在ExportTool里增加一个方法来解析annotation:</p>
<pre name="code" class="java">/**
* 解析出元数据信息,初始化excel导出
*
* @param className
* @return
* @throws ClassNotFoundException
*/
private List<Entity> parseAnnotation(Class clazz)
throws ClassNotFoundException {
List<Entity> entities = new ArrayList<Entity>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Entity e = new Entity();
boolean hasAnnotation = field.isAnnotationPresent(Cell.class);
if (hasAnnotation) {
Cell annotation = field.getAnnotation(Cell.class);
e.title = annotation.title();
e.type = field.getType().getName();
e.name = field.getName();
entities.add(e);
}
}
return entities;
}</pre>
<p> 其他的变动不大,对于需要导出的值对象,用annotation标注一下就可以了:</p>
<pre name="code" class="java">public class Student {
@Cell(title = "学号")
private long serialNumber;
@Cell(title = "姓名")
private String name;
@Cell(title = "性别")
private String sexual;
@Cell(title = "分数")
private Long score;
…
}
</pre>
<p> </p>
<p> </p>
<p> </p></div><br/>就是不知道这么大量的使用反射会不会性能有问题
2 楼
qtalen
2009-12-30
<p>LZ好,你这个挺好用的,不过我在项目搞了一些改造:</p>
<p>首先加了一个annotation:</p>
<pre name="code" class="java">@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Cell {
/**
* 该字段对应的表格头
*/
public String title();
}</pre>
<p> 接着在ExportTool里增加一个方法来解析annotation:</p>
<pre name="code" class="java">/**
* 解析出元数据信息,初始化excel导出
*
* @param className
* @return
* @throws ClassNotFoundException
*/
private List<Entity> parseAnnotation(Class clazz)
throws ClassNotFoundException {
List<Entity> entities = new ArrayList<Entity>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Entity e = new Entity();
boolean hasAnnotation = field.isAnnotationPresent(Cell.class);
if (hasAnnotation) {
Cell annotation = field.getAnnotation(Cell.class);
e.title = annotation.title();
e.type = field.getType().getName();
e.name = field.getName();
entities.add(e);
}
}
return entities;
}</pre>
<p> 其他的变动不大,对于需要导出的值对象,用annotation标注一下就可以了:</p>
<pre name="code" class="java">public class Student {
@Cell(title = "学号")
private long serialNumber;
@Cell(title = "姓名")
private String name;
@Cell(title = "性别")
private String sexual;
@Cell(title = "分数")
private Long score;
…
}
</pre>
<p> </p>
<p> </p>
<p> </p>
<p>首先加了一个annotation:</p>
<pre name="code" class="java">@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Cell {
/**
* 该字段对应的表格头
*/
public String title();
}</pre>
<p> 接着在ExportTool里增加一个方法来解析annotation:</p>
<pre name="code" class="java">/**
* 解析出元数据信息,初始化excel导出
*
* @param className
* @return
* @throws ClassNotFoundException
*/
private List<Entity> parseAnnotation(Class clazz)
throws ClassNotFoundException {
List<Entity> entities = new ArrayList<Entity>();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
Entity e = new Entity();
boolean hasAnnotation = field.isAnnotationPresent(Cell.class);
if (hasAnnotation) {
Cell annotation = field.getAnnotation(Cell.class);
e.title = annotation.title();
e.type = field.getType().getName();
e.name = field.getName();
entities.add(e);
}
}
return entities;
}</pre>
<p> 其他的变动不大,对于需要导出的值对象,用annotation标注一下就可以了:</p>
<pre name="code" class="java">public class Student {
@Cell(title = "学号")
private long serialNumber;
@Cell(title = "姓名")
private String name;
@Cell(title = "性别")
private String sexual;
@Cell(title = "分数")
private Long score;
…
}
</pre>
<p> </p>
<p> </p>
<p> </p>
1 楼
studyoo
2009-09-21
是POI不是PIO。
相关推荐
内容概要:本文详细介绍了利用Matlab进行三相逆变器SPWM调制仿真的全过程。首先明确了将110V直流电转换为220V/50Hz交流电的需求,接着阐述了SPWM调制的基本原理及其MATLAB代码实现方法,包括载波频率、调制比的选择以及三相调制信号的生成。文中还展示了逆变桥的Simulink模型搭建步骤,强调了关键参数如死区时间和LC滤波器的设计要点。通过对输出电压、电流波形的分析,验证了模型的有效性和稳定性,并提供了调参技巧和常见问题解决方案。 适合人群:从事电力电子、新能源系统研究的技术人员及高校相关专业师生。 使用场景及目标:适用于希望深入了解SPWM调制机制、掌握三相逆变器设计与优化方法的研究者;可用于教学实验、项目开发和技术培训等场合。 其他说明:文中提供的完整代码和详细的注释有助于初学者快速入门,而丰富的波形分析则为进阶用户提供宝贵的参考资料。此外,作者还分享了一些实用的小贴士,如如何避免常见的错误配置,确保仿真的顺利进行。
Android5.3 Android 组件-基础控件-例子-broadcast图片
内容概要:本文详细介绍了如何使用MATLAB实现风光场景生成与削减,特别是在处理风电和光伏发电的不确定性方面。文章首先解释了风光场景生成的概念,即通过蒙特卡洛方法模拟各种可能的风电和光伏出力情况。接着,针对生成的大量场景可能导致计算复杂的问题,提出了基于概率距离的快速削减法,通过计算场景间的概率距离,将大量场景削减至少数关键场景,从而简化后续计算。文中还展示了具体的MATLAB代码实现,包括场景生成、距离计算、场景削减等关键步骤,并讨论了一些优化技巧如并行计算、数据标准化等。此外,文章强调了该方法在电力系统调度中的重要性和实用性,能够有效提高计算效率和准确性。 适合人群:从事电力系统研究的科研人员、工程师及相关领域的学生。 使用场景及目标:适用于需要处理风电、光伏等可再生能源出力不确定性的电力系统调度和优化项目。主要目标是通过减少计算复杂度,提高调度模型的计算效率和准确性。 其他说明:文中提供的MATLAB代码具有良好的可移植性和复用性,可以根据具体应用场景进行适当修改和扩展。
毕业设计(论文) 直动式液压往复泵设计说明书.doc.doc
电动剃须刀的结构设计说明书.docx.docx
内容概要:本文介绍了DeepSeek这一开源深度学习模型的使用方法和提问技巧。DeepSeek不仅能够执行指令,还能进行思考和推理。文章提出了几种提问模板,帮助用户更有效地利用DeepSeek解决问题。其中包括“背景+需求+约束条件”、“身份+任务+要求+例子”、“我要做什么→要做什么用→希望达到什么效果→但担心什么问题”、“需求+担忧+反向验证”、“问题+追问预期+调整方向”以及“目标+条件+验证方式”。每种模板都配有详细的解释和示例,以指导用户如何构建问题,从而获得更有针对性的答案。 适合人群:适合对深度学习感兴趣的开发者、研究人员以及希望通过DeepSeek解决实际问题的用户。 使用场景及目标:①帮助用户更好地理解和使用DeepSeek,提高问题解决效率;②通过具体的提问模板,让用户能够更精准地获取所需信息;③适用于各种场景,包括但不限于技术问题解答、学习计划制定、课程推广方案设计等。 其他说明:为了充分利用DeepSeek的功能,用户在提问时应尽量提供详尽的背景信息,明确需求,并根据实际情况设置合理的约束条件。此外,用户还可以通过设定角色和任务,让DeepSeek从特定角度进行思考,从而得到更具创意和实用性的解决方案。
内容概要:本文详细介绍了支持向量机(SVM)、BP神经网络和LSTM网络在时间序列预测中的应用及其MATLAB实现。首先,针对SVM部分,文章讲解了如何将时间序列数据转化为特征矩阵并通过滑动窗口进行预测,强调了交叉验证的重要性。对于BP神经网络,则着重于数据归一化以及网络结构的选择,并指出BP网络容易陷入局部最优的问题。最后,在LSTM部分,文章展示了如何利用MATLAB的深度学习工具箱实现LSTM网络,解决了输入数据格式转换的问题,并实现了滚动预测。文中提供了具体的代码示例,确保读者能够轻松替换数据源并运行程序。 适用人群:适用于有一定MATLAB基础的时间序列预测初学者和技术爱好者。 使用场景及目标:帮助读者掌握三种不同类型的机器学习模型在时间序列预测任务中的具体应用,理解各自的特点和优缺点,从而选择合适的模型应用于实际项目中。 其他说明:文章不仅提供了详细的理论解释,还给出了完整的代码实现,使得读者可以直接上手实践。同时,作者提醒了一些常见的错误和注意事项,如数据格式、归一化等问题,有助于提高预测准确性。
(精品)热转印制作人物主题个性杯子毕业论文设计说明书.doc
5000吨年氧化羰化制碳酸二甲酯合成工艺设计说明书.doc
【3D文件】可爱小鹿3D建模,3D打印文件,免费下载 资源图片查看链接:https://blog.csdn.net/weixin_60324241/article/details/147233616?spm=1011.2415.3001.5331 欢迎查看下载
内容概要:本文详细介绍了如何利用Simulink进行BUCK变换器的电压电流双闭环控制以及多相控制的设计方法,并探讨了无刷直流电机(BLDCM)控制系统的构建。文中不仅涵盖了基本的控制理论,还提供了具体的MATLAB/Simulink代码示例,帮助读者理解和实现复杂的电力电子控制系统。对于常见的调试问题,如代数环错误、谐波失真、电流不平衡等,作者分享了许多实践经验和技术技巧。 适合人群:从事电力电子、自动化控制领域的工程师和技术人员,尤其适用于有一定Simulink基础并希望深入掌握BUCK变换器和BLDCM控制设计的专业人士。 使用场景及目标:① 学习如何在Simulink中搭建和优化BUCK变换器的电压电流双闭环控制系统;② 掌握多相BUCK变换器的均流控制策略;③ 实现BLDCM的高效换相逻辑和速度环参数整定;④ 解决仿真过程中可能出现的各种问题。 其他说明:文章强调了实际应用中的注意事项,如参数选择、模块配置、信号处理等方面的经验,有助于提高仿真的准确性和效率。同时提醒读者关注硬件保护措施,避免实验过程中损坏设备。
内容概要:本文详细介绍了如何利用粒子群优化(PSO)算法解决电力系统经济调度问题,特别是在IEEE30节点六机系统中的应用。文章首先解释了关键参数的选择及其意义,如最大迭代次数、惯性权重、学习因子等。接着深入探讨了适应度函数的设计,包括火电成本计算、失负荷惩罚以及弃风弃光惩罚。此外,还讨论了重要的约束处理方法,如爬坡速率限制和出力上下限截断。通过这些措施,实现了对六个发电机组的智能调度,使得总发电成本最小化,同时保证了系统的稳定性和可靠性。实验结果显示,相比传统调度方案,新方法使总成本降低了12.7%,弃风弃光量控制在5%以内。 适合人群:从事电力系统调度、优化算法研究的专业人士,尤其是对智能算法应用于能源管理感兴趣的工程师和技术研究人员。 使用场景及目标:适用于希望提高电力系统经济效益和环境效益的企业和个人。主要目标是在满足电力需求的前提下,减少化石燃料消耗,增加可再生能源利用率,从而达到节能减排的目的。 其他说明:文中提供的代码片段仅为示意,具体实现时还需考虑更多实际情况,如不同类型的发电机组特性、精确的气象预测数据等。此外,尽管PSO算法表现良好,但在某些极端情况下仍可能存在局限性,因此建议结合其他优化手段共同使用。
内容概要:本文详细介绍了如何使用MATLAB和CVX工具箱,通过模型预测控制(MPC)优化楼宇空调系统的能耗管理。首先,作者通过对建筑热力学特性的建模,建立了状态空间模型来描述楼宇的温度变化规律。接着,设计了一个24小时预测时域的MPC控制器,结合动态电价信号,实现了在电价低谷期预冷建筑并在电价高峰期减少制冷功率的目标。文中展示了具体的MATLAB代码片段,解释了关键参数的选择及其物理意义,并讨论了如何通过引入舒适度约束和反馈校正机制提高控制精度。最终,仿真实验表明该方法不仅能够显著降低电费支出,还能保持室内温度在舒适的范围内。 适合人群:从事楼宇自动化、能源管理和控制系统设计的研究人员和技术人员。 使用场景及目标:适用于商业建筑和工业园区的空调系统节能改造项目,旨在通过智能化控制手段实现节能减排和成本优化。 其他说明:文章强调了模型简化与计算效率之间的权衡,以及在实际应用中需要根据不同建筑物的具体情况进行参数调整。同时指出,良好的用户体验是衡量控制算法成功与否的重要标准之一。
内容概要:本文详细介绍了基于CANoe的Bootloader上位机软件开发流程及其应用,重点在于飞思卡尔MC9S12G128MLL这款16位单片机。首先解释了选择CANoe的原因,因其强大的CAN总线仿真能力和灵活的数据格式定义,非常适合Bootloader开发。接着深入探讨了下位机MC9S12G128MLL的基本配置,包括系统时钟、端口初始化以及CAN模块的设置。随后展示了具体的CAN报文收发实现方法,如通过CAPL语言编写上位机发送命令,下位机接收并处理这些命令,从而实现进入Bootloader模式的功能。此外还讨论了进一步的功能扩展,如程序下载、校验等复杂操作的设计思路和技术细节。最后强调了实际开发过程中遇到的问题及解决方案,例如Flash擦写、通信协议设计、CRC校验等方面的经验教训。 适合人群:从事嵌入式系统开发的技术人员,尤其是专注于汽车电子领域CAN总线相关项目的工程师。 使用场景及目标:适用于需要开发或优化基于CANoe的Bootloader上位机软件的项目,旨在提高嵌入式系统的升级效率和可靠性,确保在复杂环境下能够顺利完成固件更新任务。 其他说明:文中不仅提供了详细的理论讲解,还包括大量实用的代码示例,帮助读者更好地理解和掌握具体实施步骤。同时,作者分享了许多宝贵的实践经验,有助于避免常见错误,提升开发成功率。
dwaDWADWAWADWAWDADWADWA
内容概要:本文详细介绍了利用西门子S7-300 PLC和组态王软件构建散装水泥生产线在线称重控制系统的全过程。首先阐述了硬件配置,包括CPU315-2DP作为主站、ET200M分布式从站以及SM331模拟量模块用于接收称重传感器信号。接着深入解析了梯形图程序的关键部分,如OB35中断组织块用于每100ms采集一次重量数据,并采用浮点数比较器实时判断重量变化趋势。此外,还讨论了组态王的画面设计,包括实时重量显示、趋势图控件的应用以及报警机制的设置。文中特别强调了针对动态称重过程中信号跳变的问题采取了移动平均滤波算法进行优化,并分享了一些实际工程中的经验和教训,如正确的接线方式、抗干扰措施等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些对PLC编程、组态软件应用有一定基础的人群。 使用场景及目标:适用于新建或改造散装水泥生产线的称重控制系统项目。主要目标是提高称重精度,确保生产效率的同时保障产品质量。通过学习本文可以掌握完整的系统设计方案,包括硬件选型、软件编程及人机界面设计等方面的知识。 其他说明:文中提供了大量具体的代码片段和配置细节,有助于读者更好地理解和实施相关技术。同时,作者结合自身经验给出了许多宝贵的建议,对于初学者来说非常有价值。
内容概要:本文详细介绍了使用三菱FX3U PLC和MCGS触摸屏构建四路抢答器控制系统的全过程。首先明确了系统的硬件组成,包括PLC、触摸屏以及四个抢答台的按钮和指示灯。接着阐述了IO分配的具体细节,如输入输出端口的功能定义。然后深入讲解了梯形图程序的设计思路,特别是抢答锁存和互锁逻辑的实现方法。此外,还讨论了接线图原理图的关键要点,如限流电阻的选择和公共端的处理。最后介绍了MCGS组态画面的设计技巧,包括状态指示灯的颜色变化、得分统计等功能。文中还提到了一些常见的调试问题及其解决方案,如按钮触点抖动引起的误触发和指示灯闪烁问题。 适合人群:对PLC编程和工业自动化感兴趣的初学者,尤其是希望深入了解三菱PLC应用的技术人员。 使用场景及目标:适用于需要设计和实现简单但完整的PLC控制系统的场合,帮助读者掌握PLC编程的基本技能,提高实际动手能力。 其他说明:文章提供了详细的梯形图代码和接线图示例,便于读者理解和实践。同时强调了一些实用的小技巧,如防作弊机制和硬件消抖措施,有助于提升系统的可靠性和稳定性。
预防沉迷网络安全教育主题班会专业知识讲座.ppt
内容概要:本文详细介绍了基于西门子S7-200 PLC和MCGS组态软件构建的灌装生产线系统的具体实现方法和技术细节。主要内容涵盖IO分配、接线图原理、梯形图程序设计、组态画面设计以及常见问题的解决方案。文中通过具体的实例展示了如何利用PLC进行逻辑控制,确保生产过程中各个环节的安全性和准确性。同时,还探讨了如何优化传感器信号处理、提高系统稳定性和调试技巧。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和组态软件有一定了解的人群。 使用场景及目标:适用于食品饮料行业的灌装生产线自动化控制项目。主要目标是帮助技术人员理解和掌握PLC与组态软件的联合应用,提高生产线的效率和可靠性。 其他说明:文章提供了丰富的实践经验,包括硬件接线注意事项、软件编程技巧以及故障排除方法,为实际工程应用提供了宝贵的参考资料。
内容概要:本文详细介绍了基于西门子S7-1200 PLC构建的小区换热站自动控制系统的设计与实施。主要内容涵盖IO分配、流量和温度控制的具体实现方法,特别是针对流量计和电动阀的配合、PID闭环控制的应用以及温度前馈补偿等关键技术点进行了深入探讨。此外,文中还分享了多个调试过程中遇到的实际问题及其解决方案,如温度漂移、阀门响应延迟、模拟量模块干扰等问题。通过合理的硬件配置和软件优化,实现了系统的稳定运行,显著减少了热力公司的维护成本。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是对PLC编程和换热站自动化感兴趣的从业者。 使用场景及目标:适用于新建或改造小区换热站项目的规划与实施,旨在提高供暖系统的效率和稳定性,减少人为干预,确保居民冬季取暖的安全性和舒适性。 其他说明:文章不仅提供了详细的编程实例和电路连接图,还强调了实际应用中的注意事项和经验教训,对于理解和掌握类似项目的开发具有重要参考价值。