java中使用POI生成Excel并导出

注:本文章中代码均为本地Demo版本,若后续代码更新将不会更新文章

需求说明及实现方式

  1. 根据从数据库查询出的数据,将其写入excel表并导出

    我的想法是通过在实体属性上写自定义注解的方式去完成。因为我们在代码中可以通过反射的方式去获取实体类中全部的注解及属性名称等等。我们可以在自定义注解中声明一个参数value,这里面就存储其标题,这样我们

  2. 数据查询type不同,则显示的标题数量不同

    在注解类中增加type参数,只有满足对应type的属性会被导出至excel中

  3. 数据查询type不同,则显示的标题不同(同一个字段)

    优化参数value,判断传入的value是否为json字符串,如果是json字符串则找到其与type对应的value

  4. 数据的格式化(时间类型格式化、数据格式化显示)

    数据格式化显示通过在注解类中增加dict参数,该参数传入json字符串。

本来我是想着通过easyExcel来完成这些功能,但是由于项目中已经引入了POI的3.9版本依赖,然后easyExcel中POI的依赖版本又高于该版本,而且不管是版本升级还是版本排除降级,总会有一个出现问题,最终也只能通过最基础的POI编写代码实现。

需求完成

依赖引入:

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.33</version>
        </dependency>

image-20230707220251587

通用代码

  1. ExcelExport

    • value:标题,也可为json字符串
    • dict:json字符串格式的字典,格式如User中所示
    • type:数组类型,查询数据type类型是什么值时这个字段会写入excel中。如我type = {"a"},则我在查询数据时传入的type为b则不会将这个字段写入excel中,如果传入的是a则会正常写入。
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface ExcelExport {
        String value();
        String dict() default "";
        String[] type() default {};
    }
    
  2. User

    • @ExcelExport:即自定义的注解,其中值的含义在上面已经说清楚了
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Accessors(chain = true)
    public class User {
        @ExcelExport(value = "用户名",type = {"a"})
        private String userName;
        @ExcelExport(value = "{a: '年龄',b: '年纪'}",type = {"a","b"})
        private Integer age;
        @ExcelExport(value = "性别",
                dict = "[{ value: \"0\", label: \"女\" }," +
                        "{ value: \"1\", label: \"男\" }]",
                type = {"a","b"})
        private Integer sex;
        @ExcelExport(value = "生日",type = {"b"})
        private Date birthday;
    }
    
    

版本1

版本1中未实现数据查询type不同,则显示的标题不同(同一个字段)这一功能,如需要加请看PoiExcelUtil中writeTitleCellData方法。

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.lzj.anno.ExcelExport;
import com.lzj.entity.User;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.util.StringUtils;

import java.io.*;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <p>
 *
 * </p>
 *
 * @author:雷子杰
 * @date:2023/7/4
 */
public class One {
    public static void main(String[] args) throws IOException {
        List<User> userList = new ArrayList<>();
        userList.add(new User("lzj1",1,1,new Date()));
        userList.add(new User("lzj2",2,0,new Date()));
        userList.add(new User("lzj3",3,1,new Date()));
        userList.add(new User("lzj4",4,0,new Date()));

        //声明XSSF对象
        XSSFWorkbook xssfSheets = new XSSFWorkbook();
        //创建sheet
        XSSFSheet userSheet = xssfSheets.createSheet("user");

        //创建标题字体
        XSSFFont titleFont = xssfSheets.createFont();
        titleFont.setBold(true);//加粗
        titleFont.setFontName("微软雅黑");
        titleFont.setFontHeightInPoints((short) 12);//字体大小
        //创建通用字体
        XSSFFont commonFont = xssfSheets.createFont();
        commonFont.setBold(false);//加粗
        commonFont.setFontName("微软雅黑");
        commonFont.setFontHeightInPoints((short) 12);//字体大小

        // 创建标题行单元格样式
        CellStyle titleCellStyle = xssfSheets.createCellStyle();
        titleCellStyle.setBorderTop(CellStyle.BORDER_THIN);//框线
        titleCellStyle.setBorderBottom(CellStyle.BORDER_THIN);
        titleCellStyle.setBorderLeft(CellStyle.BORDER_THIN);
        titleCellStyle.setBorderRight(CellStyle.BORDER_THIN);
        titleCellStyle.setAlignment(CellStyle.ALIGN_CENTER);//水平对齐方式
        titleCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直对齐方式
        titleCellStyle.setFont(titleFont);//字体样式
        titleCellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);//单元格前景色
        titleCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);//填充单元格

        //创建通用行单元格样式
        CellStyle commonCellStyle = xssfSheets.createCellStyle();
        commonCellStyle.setBorderTop(CellStyle.BORDER_THIN);
        commonCellStyle.setBorderBottom(CellStyle.BORDER_THIN);
        commonCellStyle.setBorderLeft(CellStyle.BORDER_THIN);
        commonCellStyle.setBorderRight(CellStyle.BORDER_THIN);
        commonCellStyle.setAlignment(CellStyle.ALIGN_CENTER);
        commonCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
        commonCellStyle.setFont(commonFont);
        commonCellStyle.setWrapText(true);//自动换行

        //获取实体类中全部属性
        Field[] fields = User.class.getDeclaredFields();
        //当前行
        int currentRow = 0;
        //当前列
        int currentColumn = 0;
        //行高
        float rowHeight = 40.1f;
        //列宽
        int columnWidth = 33 * 256;
        //创建行
        XSSFRow row = userSheet.createRow(currentRow);
        当前行+1
        //currentRow++;

        //创建标题行
        // 遍历每个字段
        for (Field field : fields) {
            // 检查字段是否带有Explanation注解
            if (field.isAnnotationPresent(ExcelExport.class)) {
                // 获取Explanation注解实例
                ExcelExport explanation = field.getAnnotation(ExcelExport.class);
                // 获取注解中的解释
                String value = explanation.value();

                //创建单元格,传入值,设置单元格样式
                XSSFCell cell = row.createCell(currentColumn);
                cell.setCellValue(value);
                cell.setCellStyle(titleCellStyle);

                //设置行高度
                row.setHeightInPoints(rowHeight);
                //设置列的宽度
                userSheet.setColumnWidth(currentColumn,columnWidth);
                //当前列+1
                currentColumn++;
            }
        }
        //重置当前列
        currentColumn = 0;

        //创建数据行
        for (User user : userList) {
            //每次循环时重置列
            currentColumn = 0;
            //当前行+1
            currentRow++;
            //创建行
            row = userSheet.createRow(currentRow);
            for (Field field : fields) {
                if (field.isAnnotationPresent(ExcelExport.class)) {
                    try {
                        //解除private限制
                        field.setAccessible(true);

                        // 获取Explanation注解实例
                        ExcelExport explanation = field.getAnnotation(ExcelExport.class);
                        // 获取属性的值
                        Object value = field.get(user);

                        //日期类型格式化
                        if (value != null && field.getType() == Date.class){
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                            value = sdf.format(value);
                        }
                        //获取对应字典
                        String dict = explanation.dict();
                        if (!StringUtils.isEmpty(dict) && value != null){
                            //JSONObject jsonObject = JSON.parseObject(dict);
                            List<String> list = JSON.parseArray(dict, String.class);
                            for (String item : list) {
                                JSONObject jsonObject = JSON.parseObject(item);
                                if(value == null ? false : jsonObject.getString("value").equals(value.toString()) ){
                                    value = jsonObject.getString("label");
                                    break;
                                }
                            }
                            //value = jsonObject.get(value.toString());
                        }
                        //创建单元格,传入值,设置单元格样式
                        XSSFCell cell = row.createCell(currentColumn);
                        cell.setCellValue(value == null?"":value.toString());
                        cell.setCellStyle(commonCellStyle);

                        //设置行高度
                        row.setHeightInPoints(rowHeight);
                        //当前列+1
                        currentColumn++;

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

        // 将生成的excel文件输出流转为字节数组
        byte[] bytes = null;
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        xssfSheets.write(outputStream);
        outputStream.close();
        bytes = outputStream.toByteArray();

        //读取字节数组为文件输入流
        InputStream inputStream = new ByteArrayInputStream(bytes);
        inputStream.close();


        //在声明一个输出流将文件下载到本地
        File file = new File("C:\\Users\\86158\\Desktop\\zzzzzz.xlsx");
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
        //将bytes中的内容写入
        bufferedOutputStream.write(bytes);
        //刷新输出流,否则不会写出数据
        bufferedOutputStream.flush();
        bufferedOutputStream.close();


    }
}

版本2

版本二相比与版本1,其主要优势是将POI相关操作都封装进了PoiExcelUtil中。

  1. PoiExcelUtil

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.lzj.anno.ExcelExport;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.xssf.usermodel.*;
    import org.springframework.util.StringUtils;
    
    import java.lang.reflect.Field;
    import java.text.SimpleDateFormat;
    import java.util.*;
    
    /**
     * <p>
     *
     * </p>
     *
     * @author:雷子杰
     * @date:2023/7/6
     */
    public class PoiExcelUtil {
    
        /**
         * 获取标题字体
         * @param xssfWorkbook
         * @return
         */
        public static XSSFFont getTitleFont(XSSFWorkbook xssfWorkbook){
            //创建标题字体
            XSSFFont titleFont = xssfWorkbook.createFont();
            titleFont.setBold(true);//加粗
            titleFont.setFontName("微软雅黑");
            titleFont.setFontHeightInPoints((short) 12);//字体大小
    
            return titleFont;
        }
    
        /**
         * 获取通用字体
         * @param xssfWorkbook
         * @return
         */
        public static XSSFFont getCommonFont(XSSFWorkbook xssfWorkbook){
            //创建通用字体
            XSSFFont commonFont = xssfWorkbook.createFont();
            commonFont.setBold(false);//加粗
            commonFont.setFontName("微软雅黑");
            commonFont.setFontHeightInPoints((short) 12);//字体大小
    
            return commonFont;
        }
    
        /**
         * 获取标题单元格样式
         * @param xssfWorkbook
         * @param xssfFont
         * @return
         */
        public static CellStyle getTitleCellStyle(XSSFWorkbook xssfWorkbook , XSSFFont xssfFont){
            // 创建标题行单元格样式
            CellStyle titleCellStyle = xssfWorkbook.createCellStyle();
            titleCellStyle.setBorderTop(CellStyle.BORDER_THIN);//框线
            titleCellStyle.setBorderBottom(CellStyle.BORDER_THIN);
            titleCellStyle.setBorderLeft(CellStyle.BORDER_THIN);
            titleCellStyle.setBorderRight(CellStyle.BORDER_THIN);
            titleCellStyle.setAlignment(CellStyle.ALIGN_CENTER);//水平对齐方式
            titleCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直对齐方式
            titleCellStyle.setFont(xssfFont);//字体样式
            titleCellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);//单元格前景色
            titleCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);//填充单元格
    
            return titleCellStyle;
        }
    
        /**
         * 获取通用单元格样式
         * @param xssfWorkbook
         * @param xssfFont
         * @return
         */
        public static CellStyle getCommonCellStyle(XSSFWorkbook xssfWorkbook, XSSFFont xssfFont){
            //创建通用行单元格样式
            CellStyle commonCellStyle = xssfWorkbook.createCellStyle();
            commonCellStyle.setBorderTop(CellStyle.BORDER_THIN);
            commonCellStyle.setBorderBottom(CellStyle.BORDER_THIN);
            commonCellStyle.setBorderLeft(CellStyle.BORDER_THIN);
            commonCellStyle.setBorderRight(CellStyle.BORDER_THIN);
            commonCellStyle.setAlignment(CellStyle.ALIGN_CENTER);
            commonCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            commonCellStyle.setFont(xssfFont);
            commonCellStyle.setWrapText(true);//自动换行
    
            return commonCellStyle;
        }
    
        /**
         * 写入单个单元格数据
         * @param row 行对象
         * @param xssfSheet sheet对象
         * @param value 单元格的值
         * @param cellStyle 单元格样式
         * @param rowHeight 行高
         * @param columnWidth 列宽
         */
        public static void writeCellData(XSSFRow row, XSSFSheet xssfSheet , Object value ,CellStyle cellStyle,Integer currentColumn,Float rowHeight,Integer columnWidth){
    
            //创建单元格,传入值,设置单元格样式
            XSSFCell cell = row.createCell(currentColumn);
            cell.setCellValue(value == null ? "" : value.toString());
            cell.setCellStyle(cellStyle);
            //设置行高度
            row.setHeightInPoints(rowHeight);
            //设置列的宽度
            xssfSheet.setColumnWidth(currentColumn,columnWidth);
        }
    
        /**
         *
         * @param row 行对象
         * @param xssfSheet sheet对象
         * @param cellStyle 单元格样式
         * @param fields 反射获取得到的实体对象的全部属性
         * @param currentColumn 当前列
         * @param rowHeight 行高
         * @param columnWidth 列宽
         * @param type 类型
         */
        public static void writeTitleCellData(XSSFRow row,XSSFSheet xssfSheet,CellStyle cellStyle,Field[] fields,Integer currentColumn,Float rowHeight,Integer columnWidth,String type){
            //创建标题行
            // 遍历每个字段
            for (Field field : fields) {
                // 检查字段是否带有ExcelExport注解
                if (field.isAnnotationPresent(ExcelExport.class)) {
                    // 获取Explanation注解实例
                    ExcelExport explanation = field.getAnnotation(ExcelExport.class);
    
                    //判断是否是需要写入的数据类型
                    String[] typeArray = explanation.type();
                    Set<String> set = new HashSet<>(Arrays.asList(typeArray));
                    if (!set.contains(type)){
                     continue;
                    }
                    // 获取注解中的解释
                    String value = explanation.value();
                    //判断value是否是json格式数据
                    boolean isJson = true;
                    try{
                        Object parse = JSON.parse(value);
                    }catch (Exception e){
                        isJson = false;
                    }
                    if (isJson == true){//如果是json格式数据,则给他对应对应类型的值
                        JSONObject jsonObject = JSON.parseObject(value);
                        value = jsonObject.getString(type);
                    }
    
                    //写入单元格数据
                    PoiExcelUtil.writeCellData(row,xssfSheet,value,cellStyle,currentColumn,rowHeight,columnWidth);
                    //当前列+1
                    currentColumn++;
                }
            }
        }
    
        /**
         * 将集合数据全部写入单元格
         * @param list 需要写入excel的集合数据
         * @param currentRow 当前行
         * @param currentColumn 当前列
         * @param row 行对象
         * @param xssfSheet sheet对象
         * @param cellStyle 单元格样式
         * @param fields 反射获取得到的实体对象的全部属性
         * @param rowHeight 行高
         * @param columnWidth 列宽
         * @param type 类型
         * @param <T>
         */
        public static <T> void writeCommonRowCellData(List<T> list,Integer currentRow ,Integer currentColumn, XSSFRow row,XSSFSheet xssfSheet,CellStyle cellStyle,Field[] fields,Float rowHeight,Integer columnWidth,String type){
            //创建数据行
            for (T obj : list) {
                //每次循环时重置列
                currentColumn = 0;
                //当前行+1
                currentRow++;
                //创建行
                row = xssfSheet.createRow(currentRow);
                for (Field field : fields) {
                    // 检查字段是否带有ExcelExport注解
                    if (field.isAnnotationPresent(ExcelExport.class)) {
                        try {
                            //解除private限制
                            field.setAccessible(true);
                            // 获取Explanation注解实例
                            ExcelExport explanation = field.getAnnotation(ExcelExport.class);
    
                            //判断是否是需要写入的数据类型
                            String[] typeArray = explanation.type();
                            Set<String> set = new HashSet<>(Arrays.asList(typeArray));
                            if (!set.contains(type)){
                                continue;
                            }
    
                            // 获取属性的值
                            Object value = field.get(obj);
                            //日期类型格式化
                            if (value != null && field.getType() == Date.class){
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                                value = sdf.format(value);
                            }
                            //获取对应字典
                            String dict = explanation.dict();
                            if (!StringUtils.isEmpty(dict) && value != null){
                                List<String> parseArray = JSON.parseArray(dict, String.class);
                                for (String item : parseArray) {
                                    JSONObject jsonObject = JSON.parseObject(item);
                                    if(value == null ? false : jsonObject.getString("value").equals(value.toString()) ){
                                        value = jsonObject.getString("label");
                                        break;
                                    }
                                }
                            }
                            //写入单元格数据
                            PoiExcelUtil.writeCellData(row,xssfSheet,value,cellStyle,currentColumn,rowHeight,columnWidth);
                            //当前列+1
                            currentColumn++;
    
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    
    }
    
    
  2. Two

    import com.lzj.entity.User;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.xssf.usermodel.*;
    
    import java.io.*;
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    /**
     * <p>
     *
     * </p>
     *
     * @author:雷子杰
     * @date:2023/7/4
     */
    public class Two {
        public static void main(String[] args) throws IOException {
            List<User> userList = new ArrayList<>();
            userList.add(new User("lzj1",1,1,new Date()));
            userList.add(new User("lzj2",2,0,new Date()));
            userList.add(new User("lzj3",3,1,new Date()));
            userList.add(new User("lzj4",4,0,new Date()));
    
            //声明XSSF对象
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
            //创建sheet
            XSSFSheet userSheet = xssfWorkbook.createSheet("user");
    
            //创建标题字体
            XSSFFont titleFont = PoiExcelUtil.getTitleFont(xssfWorkbook);
            //创建通用字体
            XSSFFont commonFont = PoiExcelUtil.getCommonFont(xssfWorkbook);
            // 创建标题行单元格样式
            CellStyle titleCellStyle = PoiExcelUtil.getTitleCellStyle(xssfWorkbook,titleFont);
            //创建通用行单元格样式
            CellStyle commonCellStyle = PoiExcelUtil.getCommonCellStyle(xssfWorkbook,commonFont);
            //获取实体类中全部属性
            Field[] fields = User.class.getDeclaredFields();
            //当前行
            int currentRow = 0;
            //当前列
            int currentColumn = 0;
            //行高
            float rowHeight = 40.1f;
            //列宽
            int columnWidth = 33 * 256;
            //创建行
            XSSFRow row = userSheet.createRow(currentRow);
            //创建标题行
            PoiExcelUtil.writeTitleCellData(row,userSheet,titleCellStyle,fields,currentColumn,rowHeight,columnWidth,"b");
            //重置当前列
            currentColumn = 0;
            //创建数据行
            PoiExcelUtil.writeCommonRowCellData(userList,currentRow,currentColumn,row,userSheet,commonCellStyle,fields,rowHeight,columnWidth,"b");
    
    
            // 将生成的excel文件输出流转为字节数组
            byte[] bytes = null;
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            xssfWorkbook.write(outputStream);
            outputStream.close();
            bytes = outputStream.toByteArray();
    
            //读取字节数组为文件输入流
            InputStream inputStream = new ByteArrayInputStream(bytes);
            inputStream.close();
    
    
            //在声明一个输出流将文件下载到本地
            File file = new File("C:\\Users\\86158\\Desktop\\zzzzzz.xlsx");
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
            //将bytes中的内容写入
            bufferedOutputStream.write(bytes);
            //刷新输出流,否则不会写出数据
            bufferedOutputStream.flush();
            bufferedOutputStream.close();
    
        }
    }
    

结果展示

这是我初始化时的数据

image-20230707222652235

下面的是我type参数不同时的数据,均是以版本2来进行的写入导出。type参数修改位置如下:

image-20230707222907224

type参数为a

image-20230707222436137

type参数为b

image-20230707222633656

总结

在项目开发过程中总会遇到各式各样的问题,只有不断的学习,不断的积累,自身水平才能提高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/40852.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为申请注册盘古大模型商标;京东推出言犀大模型,率先布局产业应用

7月14日科技新闻早知道&#xff0c;一分钟速览。 1.华为申请注册盘古大模型商标&#xff1a; 据天眼查 App 显示&#xff0c;7 月 7 日&#xff0c;华为技术有限公司申请注册“华为云盘古”、“Huawei Cloud Pangu Models”文字及图形商标&#xff0c;国际分类为网站服务、社…

c基本数据类型

关键字 charshort intintlong intfloatdouble 常量和变量 常量&#xff1a;在程序运行过程中&#xff0c;其值不可改变的量变量&#xff1a;其值可以改变的量称为变量 字符数据 字符常量 直接常量&#xff1a;用单引号括起来&#xff0c;如&#xff1a;‘a’,‘b’.转义字…

zabbix 企业级监控(2) 监控linux主机

目录 配置开始 Zabbix添加linux主机 4.为agent.zabbix.com添加模板 环境&#xff1a; &#xff08;隔天做的更换了IP&#xff0c;不影响实际操作&#xff09; IP 192.168.50.50 关闭防火墙规则 更改主机名 [rootlocalhost ~]# vim /etc/hostname agent.zabbix.com [rootloca…

【UE5 多人联机教程】01-创建主界面

目录 工程地址 步骤 参考链接 工程地址 GitHub - UE4-Maple/C_MP_Lobby: 多人大厅教程项目 步骤 1. 先新建一个工程 2. 将下载的工程中的Plugins目录拷贝到自己新建的工程下 3. 打开工程&#xff0c;新建一个游戏实例 这里命名为“GI_Main” 在项目设置中设置游戏实例类为…

科技云报道:数字化转型完成后,制造业如何走向“数智”时代?

科技云报道原创。 随着我国数字化转型行动的深入推进和智能制造工程的大力实施&#xff0c;制造业正朝着“数智”时代迈进&#xff0c;生成式AI被视为推动制造业智能化发展的关键驱动力。 据预测&#xff0c;到2027年&#xff0c;将有30%的制造业采用生成式AI来提升产品研发效…

Android ViewGroup onDraw为什么没调用

ViewGroup&#xff0c;它本身并没有任何可画的东西&#xff0c;它是一个透明的控件&#xff0c;因些并不会触发onDraw&#xff0c;但是你现在给LinearLayout设置一个背景色&#xff0c;其实这个背景色不管你设置成什么颜色&#xff0c;系统会认为&#xff0c;这个LinearLayout上…

上海市静安区财政局领导带队调研合合信息,政企共话科技创新

近日&#xff0c;上海市静安区财政局副局长应文婷一行赴市北高新园区&#xff0c;实地走访科技企业上海合合信息科技股份有限公司&#xff08;简称“合合信息”&#xff09;&#xff0c;了解公司技术创新成果及产业布局&#xff0c;倾听企业在发展过程中的政策需求。合合信息董…

Linux——认识Linux的目录结构 常用命令 vim命令 权限及其控制

目录 linux的目录结构常用linux的命令ls(list)和llcd 切换目录mkdir 创建文件夹touch命令&#xff1a;创建普通文本文件pwd 显示路径whoamisu&#xff1a;普通--超级账号man&#xff1a;查看手册rm&#xff1a;删除网络命令ifconfig重定向 >>cat 查看文本文件clear清屏hi…

python使用Anconda安装Cartopy

安装 Cartopy的话官方推荐是使用conda安装&#xff0c;打开Anconda Prompt后&#xff0c;新建一个环境&#xff08;如果已有环境可跳过这步&#xff09;&#xff0c;然后激活环境&#xff1a; conda create -n newenv python3.9 conda activate newenv接着按照官网的推荐在Anc…

<数据结构>NO11.归并排序|递归|非递归|优化

文章目录 归并排序递归写法非递归写法修正方案1.归并一段拷贝一段修正方案2.修正区间 算法优化算法分析 归并排序的应用外排序和内排序 归并排序 递归写法 思路: 如果给出两个有序数组&#xff0c;我们很容易可以将它们合并为一个有序数组。因此当给出一个无序数组时&#xf…

【Ceph集群应用】Ceph块存储之RBD接口详解

Ceph块存储之RBD接口详解 1.创建Ceph块存储系统RBD接口1.1 删除镜像1.2 还原镜像1.3 在线扩容1.4 回滚镜像到指定位置1.5 删除快照1.6 快照分层1.7 快照展平1.8 镜像的导出导入 接上文基于ceph-deploy部署Ceph集群详解 1.创建Ceph块存储系统RBD接口 &#xff08;1&#xff09;…

区块链-java学习和劝退

字面意思&#xff1a;按照区域划分&#xff0c;每个区域通过可信的账本进行结算&#xff0c;将各个区域链接&#xff0c;形成小中心&#xff0c;大整体的财务结算认证体系&#xff1b; 1、学习前准备 您最好掌握一定的财务基本知识&#xff1b; 2、学习步骤 1&#xff09;区…

记一次rabbitmq消息发送成功,消费丢失问题

记一次rabbitmq消息发送成功&#xff0c;消费丢失问题 背景 测试数据归档&#xff0c;偶现数据未归档 排查 idea线上调试&#xff0c;log日志&#xff0c;数据库消息发送记录&#xff0c;代码分块重复执行看哪块出的问题&#xff0c;结果均无问题&#xff0c;最后使用rabbi…

blender 建模马拉松

效果展示 蘑菇模型创建&#xff1a; 创建蘑菇头 shift A &#xff0c;创建立方体&#xff1b; 右下工具栏添加细分修改器&#xff08;视图层级&#xff1a;2&#xff0c;渲染&#xff1a;2&#xff09;&#xff1b;tab键进入编辑模式&#xff0c;alt z 进入透显模式&…

spring复习:(24)ApplicationContext中的BeanPostProcess是在哪里注册到容器的?

在ApplicationContext实现类的构造方法里。 public ClassPathXmlApplicationContext(String configLocation) throws BeansException {this(new String[] {configLocation}, true, null);}上边的构造方法调用如下构造方法 public ClassPathXmlApplicationContext(String[] conf…

Python分布式任务队列Celery

一、分布式任务队列Celery介绍 Python celery是一个基于Python的分布式任务队列&#xff0c;主要用于任务的异步执行、定时调度和分布式处理。它采用了生产者/消费者模式&#xff0c;通过消息中间件实现多个工作者进程之间的协作。 Python celery的架构主要包括以下组件&…

transformer Position Embedding

这是最近一段很棒的 Youtube 视频&#xff0c;它深入介绍了位置嵌入&#xff0c;并带有精美的动画&#xff1a; Transformer 神经网络视觉指南 -&#xff08;第 1 部分&#xff09;位置嵌入 让我们尝试理解计算位置嵌入的公式的“sin”部分&#xff1a; 这里“pos”指的是“单词…

SQL性能规范

一、随聊 记录一下吧&#xff0c;2023年7月13日00:11:11&#xff0c;现在的状态真的很&#xff0c;忙&#xff0c;干不完的活&#xff0c;希望巨大的压力&#xff0c;能够让自己快速成长&#xff0c;回想我这一路&#xff0c;21年大专毕业&#xff0c;用一年时间熟悉软件&…

使用selenium模拟登录解决滑块验证问题

目录 1.登录入口 2.点击“账号密码登录” 3.输入账号、密码并点击登录 4.滑块验证过程 5.小结 本次主要是使用selenium模拟登录网页端的TX新闻&#xff0c;本来最开始是模拟请求的&#xff0c;但是某一天突然发现&#xff0c;部分账号需要经过滑块验证才能正常登录&#x…

【个人笔记】对linux中一切皆文件的理解与ls命令

目录 Linux中一切皆文件ls命令常用参数常用命令lscpu lspci Linux中一切皆文件 理解参考&#xff1a;为什么说&#xff1a;Linux中一切皆文件&#xff1f; ls命令 ls&#xff08;英文全拼&#xff1a; list directory contents&#xff09;命令用于显示指定工作目录下之内容…