brv601
码龄18年
关注
提问 私信
  • 博客:699,767
    社区:320
    问答:671
    700,758
    总访问量
  • 55
    原创
  • 49,294
    排名
  • 66
    粉丝
  • 0
    铁粉

个人简介:--------热爱生活,珍惜身边的一切!----------

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:上海市
  • 加入CSDN时间: 2007-04-28
博客简介:

jihuanliang的专栏

查看详细资料
  • 原力等级
    领奖
    当前等级
    0
    当前总分
    12
    当月
    0
个人成就
  • 获得79次点赞
  • 内容获得46次评论
  • 获得106次收藏
创作历程
  • 1篇
    2024年
  • 6篇
    2015年
  • 10篇
    2014年
  • 25篇
    2013年
  • 23篇
    2012年
  • 18篇
    2011年
  • 5篇
    2008年
  • 8篇
    2007年
成就勋章
TA的专栏
  • LLM
    1篇
  • 人工智能
    1篇
  • AIGC
    1篇
  • java
    25篇
  • oracle
    27篇
  • programming life
    12篇
  • json
    3篇
  • javaScript
    5篇
  • eclipse
    8篇
  • j2ee
    11篇
  • ood
    2篇
  • ssh
    1篇
  • xml
    1篇
  • linux
    1篇
  • mysql
    1篇
  • struts2
    1篇
  • Middleware
    1篇
  • etl
    1篇
  • extjs
    1篇
  • bigData
    4篇
  • html
  • mybatis
    1篇
  • jstl
    1篇
  • hadoop
    2篇
兴趣领域 设置
  • 后端
    架构
创作活动更多

如何做好一份技术文档?

无论你是技术大神还是初涉此领域的新手,都欢迎分享你的宝贵经验、独到见解与创新方法,为技术传播之路点亮明灯!

174人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

部署大模型LLM

部署大模型
原创
发布博客 2024.06.16 ·
1305 阅读 ·
18 点赞 ·
0 评论 ·
11 收藏

hadoop 配置集群之间SSH无密码登陆 (重点推荐)

在"Hadoop集群(第1期)"安装CentOS6.0时,我们选择了一些基本安装包,所以我们需要两个服务:ssh和rsync已经安装了。可以通过下面命令查看结果显示如下: rpm –qa | grep opensshrpm –qa | grep rsync    假设没有安装ssh和rsync,可以通过下面命令进行安装。
转载
发布博客 2015.08.31 ·
9356 阅读 ·
3 点赞 ·
1 评论 ·
9 收藏

Hadoop2.5.2 64bit 完全分布式安装

Hadoop2.5.2 64bit 完全分布式安装 1.        安装环境Windows 7 64bitVMware Workstation 10CentOS6.5  64bitjdk版本: jdk-7u9-linux-x64.tar.gz hadoop版本: hadoop-2.5.2-src.tar.gz hadoop集群3个节点,一主两从,如下:
原创
发布博客 2015.08.27 ·
3509 阅读 ·
0 点赞 ·
0 评论 ·
3 收藏

请问: 用java代码创建excel表格模板,例子如下怎么创建?

答:

package com.paic.gcc.service.offwork.util;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletResponse;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**

  • 导入导出Excel工具类
    *
    */
    public class ExcelUtil {

    /**

    • @MethodName : listToExcel
    • @Description : 导出Excel(可以导出到本地文件系统,也可以导出到浏览器,可自定义工作表大小)
    • @param list
    • 数据源
    • @param fieldMap
    • 类的英文属性和Excel中的中文列名的对应关系 如果需要的是引用对象的属性,则英文属性使用类似于EL表达式的格式
    • 如:list中存放的都是student,student中又有college属性,而我们需要学院名称,则可以这样写
    • fieldMap.put("college.collegeName","学院名称")
    • @param sheetName
    • 工作表的名称
    • @param sheetSize
    • 每个工作表中记录的最大个数
    • @param out
    • 导出流
    • @throws ExcelException
      */
      public static void listToExcel(List list, Map fieldMap, String sheetName, int sheetSize, OutputStream out)
      throws ExcelException {

      if (list == null || list.isEmpty()) {
      throw new ExcelException("数据源中没有任何数据");
      }

      if (sheetSize > 65535 || sheetSize < 1) {
      sheetSize = 65535;
      }

      // 创建工作簿并发送到OutputStream指定的地方
      WritableWorkbook wwb;
      try {
      wwb = Workbook.createWorkbook(out);

      // 因为2003的Excel一个工作表最多可以有65536条记录,除去列头剩下65535条
      // 所以如果记录太多,需要放到多个工作表中,其实就是个分页的过程
      // 1.计算一共有多少个工作表
      double sheetNum = Math.ceil(list.size() / new Integer(sheetSize).doubleValue());
      
      // 2.创建相应的工作表,并向其中填充数据
      for (int i = 0; i < sheetNum; i++) {
          // 如果只有一个工作表的情况
          if (1 == sheetNum) {
              WritableSheet sheet = wwb.createSheet(sheetName, i);
              fillSheet(sheet, list, fieldMap, 0, list.size() - 1);
      
              // 有多个工作表的情况
          } else {
              WritableSheet sheet = wwb.createSheet(sheetName + (i + 1), i);
      
              // 获取开始索引和结束索引
              int firstIndex = i * sheetSize;
              int lastIndex = (i + 1) * sheetSize - 1 > list.size() - 1 ? list.size() - 1 : (i + 1) * sheetSize - 1;
              // 填充工作表
              fillSheet(sheet, list, fieldMap, firstIndex, lastIndex);
          }
      }
      
      wwb.write();
      wwb.close();
      

      } catch (Exception e) {
      e.printStackTrace();
      // 如果是ExcelException,则直接抛出
      if (e instanceof ExcelException) {
      throw (ExcelException) e;

          // 否则将其它异常包装成ExcelException再抛出
      } else {
          throw new ExcelException("导出Excel失败");
      }
      

      }

    }

    /**

    • @MethodName : listToExcel
    • @Description : 导出Excel(可以导出到本地文件系统,也可以导出到浏览器,工作表大小为2003支持的最大值)
    • @param list
    • 数据源
    • @param fieldMap
    • 类的英文属性和Excel中的中文列名的对应关系
    • @param out
    • 导出流
    • @throws ExcelException
      */
      public static void listToExcel(List list, Map fieldMap, String sheetName, OutputStream out)
      throws ExcelException {

      listToExcel(list, fieldMap, sheetName, 65535, out);

    }

    /**

    • @MethodName : listToExcel
    • @Description : 导出Excel(导出到浏览器,可以自定义工作表的大小)
    • @param list
    • 数据源
    • @param fieldMap
    • 类的英文属性和Excel中的中文列名的对应关系
    • @param sheetSize
    • 每个工作表中记录的最大个数
    • @param response
    • 使用response可以导出到浏览器
    • @throws ExcelException
      */
      public static void listToExcel(List list, Map fieldMap, String sheetName, int sheetSize,
      HttpServletResponse response) throws ExcelException {

      // 设置默认文件名为当前时间:年月日时分秒
      String fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();

      // 设置response头信息
      response.reset();
      response.setContentType("application/vnd.ms-excel"); // 改成输出excel文件
      response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xls");

      // 创建工作簿并发送到浏览器
      try {

      OutputStream out = response.getOutputStream();
      listToExcel(list, fieldMap, sheetName, sheetSize, out);
      

      } catch (Exception e) {
      e.printStackTrace();

      // 如果是ExcelException,则直接抛出
      if (e instanceof ExcelException) {
          throw (ExcelException) e;
      
          // 否则将其它异常包装成ExcelException再抛出
      } else {
          throw new ExcelException("导出Excel失败");
      }
      

      }
      }

    /**

    • @MethodName : listToExcel
    • @Description : 导出Excel(导出到浏览器,工作表的大小是2003支持的最大值)
    • @param list
    • 数据源
    • @param fieldMap
    • 类的英文属性和Excel中的中文列名的对应关系
    • @param response
    • 使用response可以导出到浏览器
    • @throws ExcelException
      */
      public static void listToExcel(List list, Map fieldMap, String sheetName, HttpServletResponse response)
      throws ExcelException {

      listToExcel(list, fieldMap, sheetName, 65535, response);
      }

    /*

    • <-------------------------辅助的私有方法------------------------------------------
    • -----> / /*
    • @MethodName : getFieldValueByName
    • @Description : 根据字段名获取字段值
    • @param fieldName
    • 字段名
    • @param o
    • 对象
    • @return 字段值
      */
      private static Object getFieldValueByName(String fieldName, Object o) throws Exception {

      Object value = null;
      Field field = getFieldByName(fieldName, o.getClass());

      if (field != null) {
      field.setAccessible(true);
      value = field.get(o);
      } else {
      throw new ExcelException(o.getClass().getSimpleName() + "类不存在字段名 " + fieldName);
      }

      return value;
      }

    /**

    • @MethodName : getFieldByName
    • @Description : 根据字段名获取字段
    • @param fieldName
    • 字段名
    • @param clazz
    • 包含该字段的类
    • @return 字段
      */
      private static Field getFieldByName(String fieldName, Class<?> clazz) {
      // 拿到本类的所有字段
      Field[] selfFields = clazz.getDeclaredFields();

      // 如果本类中存在该字段,则返回
      for (Field field : selfFields) {
      if (field.getName().equals(fieldName)) {
      return field;
      }
      }

      // 否则,查看父类中是否存在此字段,如果有则返回
      Class<?> superClazz = clazz.getSuperclass();
      if (superClazz != null && superClazz != Object.class) {
      return getFieldByName(fieldName, superClazz);
      }

      // 如果本类和父类都没有,则返回空
      return null;
      }

    /**

    • @MethodName : getFieldValueByNameSequence
    • @Description : 根据带路径或不带路径的属性名获取属性值
    • 即接受简单属性名,如userName等,又接受带路径的属性名,如student.department.name等
    • @param fieldNameSequence
    • 带路径的属性名或简单属性名
    • @param o
    • 对象
    • @return 属性值
    • @throws Exception
      */
      private static Object getFieldValueByNameSequence(String fieldNameSequence, Object o) throws Exception {

      Object value = null;

      // 将fieldNameSequence进行拆分
      String[] attributes = fieldNameSequence.split("\.");
      if (attributes.length == 1) {
      value = getFieldValueByName(fieldNameSequence, o);
      } else {
      // 根据属性名获取属性对象
      Object fieldObj = getFieldValueByName(attributes[0], o);
      String subFieldNameSequence = fieldNameSequence.substring(fieldNameSequence.indexOf(".") + 1);
      value = getFieldValueByNameSequence(subFieldNameSequence, fieldObj);
      }
      return value;

    }

    /**

    • @MethodName : setFieldValueByName
    • @Description : 根据字段名给对象的字段赋值
    • @param fieldName
    • 字段名
    • @param fieldValue
    • 字段值
    • @param o
    •        对象
      

      */
      @SuppressWarnings("unused")
      private static void setFieldValueByName(String fieldName, Object fieldValue, Object o) throws Exception {

      Field field = getFieldByName(fieldName, o.getClass());
      if (field != null) {
      field.setAccessible(true);
      // 获取字段类型
      Class<?> fieldType = field.getType();

      // 根据字段类型给字段赋值
      if (String.class == fieldType) {
          field.set(o, String.valueOf(fieldValue));
      } else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) {
          field.set(o, Integer.parseInt(fieldValue.toString()));
      } else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) {
          field.set(o, Long.valueOf(fieldValue.toString()));
      } else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) {
          field.set(o, Float.valueOf(fieldValue.toString()));
      } else if ((Short.TYPE == fieldType) || (Short.class == fieldType)) {
          field.set(o, Short.valueOf(fieldValue.toString()));
      } else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) {
          field.set(o, Double.valueOf(fieldValue.toString()));
      } else if (Character.TYPE == fieldType) {
          if ((fieldValue != null) && (fieldValue.toString().length() > 0)) {
              field.set(o, Character.valueOf(fieldValue.toString().charAt(0)));
          }
      } else if (Date.class == fieldType) {
          field.set(o, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(fieldValue.toString()));
      } else {
          field.set(o, fieldValue);
      }
      

      } else {
      throw new ExcelException(o.getClass().getSimpleName() + "类不存在字段名 " + fieldName);
      }
      }

    /**

    • @MethodName : setColumnAutoSize
    • @Description : 设置工作表自动列宽和首行加粗
    • @param ws */ private static void setColumnAutoSize(WritableSheet ws, int extraWith) { // 获取本列的最宽单元格的宽度 for (int i = 0; i < ws.getColumns(); i++) { int colWith = 0; for (int j = 0; j < ws.getRows(); j++) { String content = ws.getCell(i, j).getContents().toString(); int cellWith = content.length(); if (colWith < cellWith) { colWith = cellWith; } } // 设置单元格的宽度为最宽宽度+额外宽度 ws.setColumnView(i, colWith + extraWith); }

    }

    /**

    • @MethodName : fillSheet
    • @Description : 向工作表中填充数据
    • @param sheet
    • 工作表
    • @param list
    • 数据源
    • @param fieldMap
    • 中英文字段对应关系的Map
    • @param firstIndex
    • 开始索引
    • @param lastIndex
    •        结束索引
      

      */
      private static void fillSheet(WritableSheet sheet, List list, Map fieldMap, int firstIndex, int lastIndex)
      throws Exception {

      // 定义存放英文字段名和中文字段名的数组
      String[] enFields = new String[fieldMap.size()];
      String[] cnFields = new String[fieldMap.size()];

      // 填充数组
      int count = 0;
      for (Entry entry : fieldMap.entrySet()) {
      enFields[count] = entry.getKey();
      cnFields[count] = entry.getValue();
      count++;
      }
      // 填充表头
      for (int i = 0; i < cnFields.length; i++) {
      Label label = new Label(i, 0, cnFields[i]);
      sheet.addCell(label);
      }

      // 填充内容
      int rowNo = 1;
      for (int index = firstIndex; index <= lastIndex; index++) {
      // 获取单个对象
      T item = list.get(index);
      for (int i = 0; i < enFields.length; i++) {
      Object objValue = getFieldValueByNameSequence(enFields[i], item);
      String fieldValue = objValue == null ? "" : objValue.toString();
      Label label = new Label(i, rowNo, fieldValue);
      sheet.addCell(label);
      }

      rowNo++;
      

      }

      // 设置自动列宽
      setColumnAutoSize(sheet, 5);
      }

}

回答问题 2015.08.20

jstl fmt:formatDate格式化日期 年月 String to Date

使用fmt函数需在jsp中引入 报java.lang.IllegalArgumentException: Cannot convert 20131125 of type class java.lang.String to class java.util.Date 异常    因为${item.expDate}取出来是String类型,无法转换为Date类型 如下将能正常
原创
发布博客 2015.03.26 ·
28417 阅读 ·
4 点赞 ·
2 评论 ·
7 收藏

java String 分割 split 特殊字符

java String 分割 split 特殊字符需要注意以下特殊字符 (均需要转义\\)"|" "." "*" "_" "+" ""api:public String[] split(String regex)Splits this string around matches of the given regular expression.参数regex是一个 regular
原创
发布博客 2015.03.23 ·
12630 阅读 ·
0 点赞 ·
1 评论 ·
1 收藏

java 反射 根据属性 动态设置值

package com.jhl.jvm.lesson8;import java.lang.reflect.Field; /** * * @author jhl * java 反射 根据属性 动态设置值 demo * */ public class ExceptionLog { private String exceptionLogId; private
原创
发布博客 2015.03.06 ·
10028 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

fastjson - 之常见的数据类型与json的相互转换

public class FastJsonTest1 { /** * 数组转json格式字符串 */ public void array2Json(){ String[] arr = {"bill","green","maks","jim"}; String jsonText = JSON.toJSONString(arr, tru
转载
发布博客 2015.01.13 ·
6820 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

读代码整洁之道

现在的软件系统开发难度主要在于其复杂度和规模,客户需求也不再像Winston Royce瀑布模型期望那样在系统编码前完成所有的设计满足用户软件需求。在这个信息爆炸技术日新月异的时代,需求总是在不停的变化,随之在2001年业界17位大牛聚集在美国犹他州的滑雪胜地雪鸟(Snowbird)雪场,提出了“Agile”(敏捷)软件开发价值观,并在他们的努力推动下,开始在业界流行起来。在《代码整洁之道》(Cl
转载
发布博客 2014.12.24 ·
929 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

PropertyUtils.copyProperties()用法和性能

BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。使用PropertyUtils.copyProperties()拷贝一个bean中的属性到另一个bean中,第一个参数是目标bean,第二个
转载
发布博客 2014.12.10 ·
3271 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

ibatis 中 $与#的区别

在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如: select * from table where id = #id# ,其中如果字段id为字符型,那么#id#表示的就是'id'类型,如果id为整型,那么#id#就是id类型。 select * fro
转载
发布博客 2014.10.07 ·
911 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

eclipse svn 不能正常显示svn的属性

既然这个工程下svn插件有问题,那看看其它工程是否正常呢,于是切换工作空间,看看以前的项目中svn插件是否正常。换过去一看,果然,之前的项目都是好的,svn的图标正确显示,更新也没有问题,完全是好的!既然都是同一个插件,一个项目好,一个项目坏,问题到底出在哪里呢?那这就说明问题可能不在svn插件本身,而是项目中某些错误的数据导致了这个问题,这个时候我就在想到底是这两个项目的什么差异导致了这
转载
发布博客 2014.04.21 ·
2983 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

sleep和wait的区别

1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。2、最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。sleep不出让系统资源;w
转载
发布博客 2014.03.20 ·
804 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Oracle用户和模式的区别

Oracle用户(user)是用连接数据库和访问数据库对象的,那么它和模式(schema)究竟有何区别呢?下文就将带您寻找答案。 Oracle用户是Oracle数据库中的重要概念,下面就为您介绍Oracle用户和模式的区别,希望对您学习Oracle用户方面能够有所帮助。(一)什么Oracle叫用户(user):A user is a name defined in the data
转载
发布博客 2014.02.20 ·
1347 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

eclipse开发的项目导入到myeclipse

myeclipse 中的 所有工程底下都有两个文件 一个是.classpath 文件,一个是.project文件; 在myeclipse中随便建个工程,把里面的这两个文件copy到你要导入的eclipse工程目录下. 在myEclipse中新建你的项目,然后把你的eclipse中项目的文件和文件夹按照原来的顺序拷贝到新建的项目中,再次发布就行了。
原创
发布博客 2014.01.24 ·
12575 阅读 ·
1 点赞 ·
0 评论 ·
3 收藏

代码里使用字符串操作来拼接sql语句的坏处

1. 字符串操作更容易出错。2. sql语句不可避免地出现在代码里,无法坐到代码与数据分离.代码可读性降低。3. 效率. 很多情况下需要多次执行同一句sql语句,只是参数不同.如果使用PreparedStatement(Java),只需要在第一次执行是编译sql语句,之后的执行效率可以提高。4. 如果代码里使用字符串操作来拼接sql语句,那么在编译阶段是不可能发现sql语句
原创
发布博客 2014.01.16 ·
11901 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

转义字符

"br"  的转义字符分别对应:                 -------------------                          <br>"br"                 --------------------                                "br"         --------------
原创
发布博客 2014.01.09 ·
2172 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

解决myclipse不编译的方法

在开发中经常遇到myeclipse不编译的情况,但不同情况的解决方法又不一样,今天同样是遇到此类情况,在网上狂搜,终于找到一篇好文,它囊括了解决这种情况的常用的方法,现在发出来与大家分享。我遇到的情况是通过最后一个方法解决的:classpath文件,里面的路径不正确。MyEclipse不编译 解决1. 确保 project->build automatically    已经被选上.
转载
发布博客 2014.01.07 ·
1558 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

oracle 多列转成一列(列转行)、 行转列

--6列转成两列with temp as (select   a.iid_sn,   a.product_name,   a.sales_figures,   a.selling_cost,   a.pretax_profit,   a.closing_inventory    from is_import_detail a, is_import b   w
原创
发布博客 2013.12.16 ·
11585 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

left join (on 和 where条件放置的区别)

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。      在使用left jion时,on和where条件的区别如下:1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)
转载
发布博客 2013.12.16 ·
17381 阅读 ·
2 点赞 ·
2 评论 ·
13 收藏
加载更多