使用poi导出excel

之前在csdn上面也看到许多的使用poi导出excel,不过想对来说比较简单,本人查阅相关的资料,对于工作中遇到的问题,有一定的帮助,不过对于复杂的excel导出,就没办法解决,当然对于简单的excel导出,推荐使用freemarker的方式实现(前提是非动态的数据),这类的资料 很多,就不一一阐述了,这里介绍使用poi导出动态的excel的方式。
首先,需要添加相关的poi的依赖,这里推荐大家一个远程依赖包的地址:http://mvnrepository.com/,在导航栏搜索你想要的技术名称,比如这里是poi:
在这里插入图片描述
这里推荐使用使用人数最多的一个选项:
在这里插入图片描述
在这里插入图片描述
这里有各种导入依赖的方式,其中省略了一步,图片太多就不贴出来了,请大家自行摸索。
解决了依赖问题之后:
这里写了一个测试类给大家方便大家观看:本人使用的是springboot的环境,所以有环境问题导致错误,需要自行解决,仅供参考流程。

public class WorkBookTest {

    static final Logger log = LoggerFactory.getLogger(WorkBookTest.class);

    @Test
    public void testCellStyle(){
    //创建HSSFWorkbook 对象
        HSSFWorkbook hw = new HSSFWorkbook();
        HSSFSheet sheet = hw.createSheet();

        //创建单元格
        HSSFRow row = sheet.createRow(1);
        CellRangeAddress cra = new CellRangeAddress(1,3,1,3);
        sheet.addMergedRegion(cra);
        HSSFCell cell = row.createCell(1);
        cell.setCellValue(121212);

        //设置样式
        HSSFCellStyle hssfCellStyle = hw.createCellStyle();
        hssfCellStyle.setAlignment(HorizontalAlignment.CENTER);   //设置居中样式
        hssfCellStyle.setBorderBottom(BorderStyle.THIN);
        hssfCellStyle.setBorderLeft(BorderStyle.THIN);
        hssfCellStyle.setBorderRight(BorderStyle.THIN);
        hssfCellStyle.setBorderTop(BorderStyle.THIN);
        hssfCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置上下居中

        //添加边框,这个方法可以解决合并单元格没有边框的问题
        for (int i = cra.getFirstRow(); i <=cra.getLastRow() ; i++) {
            if (sheet.getRow(i)==null){
                HSSFRow row1 = sheet.createRow(i);
            }
            HSSFRow row1 = sheet.getRow(i);
            for (int j = cra.getFirstColumn(); j <= cra.getLastColumn(); j++) {
                if (row1.getCell(j)==null){
                    HSSFCell cell1 = row1.createCell(j);
                }
                HSSFCell cell1 = row1.getCell(j);
                cell1.setCellValue("");
                cell1.setCellStyle(hssfCellStyle);
            }
        }

        //文件名称,输出到项目中,浏览器需要使用request,和response的方式,请自行检索,很多!!!
        String fileName = new Date().getTime() + "";
        String filePath  = "C:\\23\\tt_research\\tt_research\\src\\main\\resources\\";
        File file = new File(filePath + fileName + ".xls");

        try {
            OutputStream os = new FileOutputStream(file);
            hw.write(os);
            log.info("test --> success");
        } catch (Exception e) {
            e.printStackTrace();
            log.info("test --> failed");
        }
    }
}

通过简单的demo之后,你已经了解了具体的步骤,如何实现动态的单元格合并和插入数据的问题。
因为单元格能先合并,再插入数据,因此需要先合并单元格,再插入数据,
这里贴部分代码,本人代码比较多,以为数据类型很复杂,请看
int typeCount = baseCount+1;
int timeCount = baseCount;
int projectCount = baseCount;
int serialCount = baseCount;
这几个参数的变化情况,

 /*
    * 第二个方式,重新写用于实现数据单元格的合并
    * */
    private int setExcelStyleModel(Map<String,List<Map<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>>>> map,HSSFCellStyle hssfCellStyle,Integer baseCount,String typeName,HSSFSheet sheet){

        //定义一些基础数据,用户获取最开始的row在哪一行
        int typeCount = baseCount+1;
        int timeCount = baseCount;
        int projectCount = baseCount;
        int serialCount = baseCount;

        //拿到时间类型的集合
        List<Map<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>>> timeMapList = map.get(typeName);
        if (timeMapList.size() > 1){
            //不止一种时间类型集合,接下来就不需要判断,因为处于不同的时间集合类型中
            for (int i = 0; i < timeMapList.size(); i++) {
                timeCount = baseCount+1;
                Map<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>> timeMap = timeMapList.get(i);
                Set<Map.Entry<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>>> entrySetProject = timeMap.entrySet();
                for (Map.Entry<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>> entryProject : entrySetProject) {
                    List<Map<String, List<Map<String, List<ProductItemDto>>>>> projectNoMapList = entryProject.getValue();
                    //判断每个时间类型下面的projectNo是否只存在一个
                    if (projectNoMapList.size() >1){
                        for (int i1 = 0; i1 < projectNoMapList.size(); i1++) {
                            projectCount=baseCount+1;
                            Map<String, List<Map<String, List<ProductItemDto>>>> projectMap = projectNoMapList.get(i1);
                            Set<Map.Entry<String, List<Map<String, List<ProductItemDto>>>>> entrySetSerialNo = projectMap.entrySet();
                            for (Map.Entry<String, List<Map<String, List<ProductItemDto>>>> entrySerialNo : entrySetSerialNo) {
                                List<Map<String, List<ProductItemDto>>> serialNoMapList = entrySerialNo.getValue();
                                for (int i2 = 0; i2 < serialNoMapList.size(); i2++) {
                                    serialCount=baseCount+1;
                                    Map<String, List<ProductItemDto>> serialNoMap = serialNoMapList.get(i2);
                                    Set<Map.Entry<String, List<ProductItemDto>>> entries = serialNoMap.entrySet();
                                    for (Map.Entry<String, List<ProductItemDto>> entry : entries) {
                                        List<ProductItemDto> productItemDtoList = entry.getValue();
                                        for (int i3 = 0; i3 < productItemDtoList.size(); i3++) {
                                            baseCount++;
                                        }
                                    }
                                    //合并serialNo单元格
                                    if (serialCount==baseCount){
                                        continue;
                                    }else {
                                        CellRangeAddress cra = new CellRangeAddress(serialCount, baseCount, 3, 3);
                                        sheet.addMergedRegion(cra);
                                        setCellStyle(hssfCellStyle, sheet, cra);
                                    }
                                }
                            }
                            //合并projectNo单元格
                            if (projectCount==baseCount){
                                continue;
                            }else{
                                CellRangeAddress cra = new CellRangeAddress(projectCount, baseCount, 2, 2);
                                sheet.addMergedRegion(cra);
                                setCellStyle(hssfCellStyle, sheet, cra);
                            }
                        }
                    }else {
                        //只有一种projectNoList类型的集合
                        final int projectCountTemp=baseCount+1;
                        Map<String, List<Map<String, List<ProductItemDto>>>> projectNoMap = projectNoMapList.get(0);
                        Set<Map.Entry<String, List<Map<String, List<ProductItemDto>>>>> entrySetSerialNo = projectNoMap.entrySet();
                        for (Map.Entry<String, List<Map<String, List<ProductItemDto>>>> entrySerialNo : entrySetSerialNo) {
                            List<Map<String, List<ProductItemDto>>> serialNoMapList = entrySerialNo.getValue();
                            //判断是否只有一个serialNo单据号
                            if (serialNoMapList.size() > 1){
                                //不存在一种项目号
                                for (int i1 = 0; i1 < serialNoMapList.size(); i1++) {
                                    //从下一个单元格开始合并
                                    serialCount=baseCount+1;
                                    Map<String, List<ProductItemDto>> serialNoMap = serialNoMapList.get(i1);
                                    Set<Map.Entry<String, List<ProductItemDto>>> entries = serialNoMap.entrySet();
                                    for (Map.Entry<String, List<ProductItemDto>> entry : entries) {
                                        List<ProductItemDto> productItemDtoList = entry.getValue();
                                        for (int i2 = 0; i2 < productItemDtoList.size(); i2++) {
                                            baseCount++;
                                        }
                                    }
                                    //当行数不止一条的时候
                                    if (serialCount==baseCount){
                                        continue;
                                    }else {
                                        //存在不止一种serialNo的数据,每次遍历完之后就需要合并
                                        CellRangeAddress cra = new CellRangeAddress(serialCount, baseCount, 3, 3);
                                        sheet.addMergedRegion(cra);
                                        setCellStyle(hssfCellStyle, sheet, cra);
                                    }
                                }
                            }else {
                                //只存在一个serialNo的数据
                                serialCount=baseCount+1;
                                Map<String, List<ProductItemDto>> serialNoMap = serialNoMapList.get(0);
                                Set<Map.Entry<String, List<ProductItemDto>>> entries = serialNoMap.entrySet();
                                for (Map.Entry<String, List<ProductItemDto>> entry : entries) {
                                    List<ProductItemDto> productItemDtoList = entry.getValue();
                                    for (int i1 = 0; i1 < productItemDtoList.size(); i1++) {
                                        baseCount++;
                                    }
                                }
                                //合并serialNoCount单元格
                                if (serialCount==baseCount){
                                    continue;
                                }else {
                                    //只有一种serialNo类型的数据
                                    CellRangeAddress cra = new CellRangeAddress(serialCount, baseCount, 3, 3);
                                    sheet.addMergedRegion(cra);
                                    setCellStyle(hssfCellStyle, sheet, cra);
                                }
                            }
                        }
                        //合并projectNo单元格
                        if (projectCountTemp==baseCount){
                            continue;
                        }else {
                            CellRangeAddress cra = new CellRangeAddress(projectCountTemp, baseCount, 2, 2);
                            sheet.addMergedRegion(cra);
                            setCellStyle(hssfCellStyle, sheet, cra);
                        }
                    }
                }
                //合并time
                if (timeCount==baseCount){
                    continue;
                }else {
                    CellRangeAddress cra = new CellRangeAddress(timeCount, baseCount, 1, 1);
                    sheet.addMergedRegion(cra);
                    setCellStyle(hssfCellStyle, sheet, cra);
                }
            }
        }else {
            timeCount=baseCount+1;
            //只有一种时间类型集合
            //判断时间类型集合里面是否只要一种project集合
            Map<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>> timeMap = timeMapList.get(0);
            //遍历timeMap
            Set<Map.Entry<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>>> entrySetProject = timeMap.entrySet();
            for (Map.Entry<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>> entryProject : entrySetProject) {
                List<Map<String, List<Map<String, List<ProductItemDto>>>>> projectMapList = entryProject.getValue();
                //判断是否只有一种类型的 projectMap
                if (projectMapList.size() >1){
                    for (int i = 0; i < projectMapList.size(); i++) {
                        projectCount=baseCount+1;
                        Map<String, List<Map<String, List<ProductItemDto>>>> projectMap = projectMapList.get(i);
                        Set<Map.Entry<String, List<Map<String, List<ProductItemDto>>>>> entrySetSerialNo = projectMap.entrySet();
                        for (Map.Entry<String, List<Map<String, List<ProductItemDto>>>> entrySerialNo : entrySetSerialNo) {
                            List<Map<String, List<ProductItemDto>>> serialNoMapList = entrySerialNo.getValue();
                            for (int i1 = 0; i1 < serialNoMapList.size(); i1++) {
                                serialCount=baseCount+1;
                                Map<String, List<ProductItemDto>> serialNoMap = serialNoMapList.get(i1);
                                Set<Map.Entry<String, List<ProductItemDto>>> entries = serialNoMap.entrySet();
                                for (Map.Entry<String, List<ProductItemDto>> entry : entries) {
                                    List<ProductItemDto> productItemDtoList = entry.getValue();
                                    for (int i2 = 0; i2 < productItemDtoList.size(); i2++) {
                                        baseCount++;
                                    }
                                }
                                //合并serialNo单元格
                                if (serialCount==baseCount){
                                    continue;
                                }else {
                                    CellRangeAddress cra = new CellRangeAddress(serialCount, baseCount, 3, 3);
                                    sheet.addMergedRegion(cra);
                                    setCellStyle(hssfCellStyle, sheet, cra);
                                }
                            }
                        }
                        //合并projectNo单元格
                        if (projectCount==baseCount){
                            continue;
                        }else{
                            CellRangeAddress cra = new CellRangeAddress(projectCount, baseCount, 2, 2);
                            sheet.addMergedRegion(cra);
                            setCellStyle(hssfCellStyle, sheet, cra);
                        }
                    }
                }else {
                    //只有一种projectNoList类型的集合
                    projectCount=baseCount+1;
                    Map<String, List<Map<String, List<ProductItemDto>>>> projectNoMap = projectMapList.get(0);
                    Set<Map.Entry<String, List<Map<String, List<ProductItemDto>>>>> entrySetSerialNo = projectNoMap.entrySet();
                    for (Map.Entry<String, List<Map<String, List<ProductItemDto>>>> entrySerialNo : entrySetSerialNo) {
                        List<Map<String, List<ProductItemDto>>> serialNoMapList = entrySerialNo.getValue();
                        //判断是否只有一个serialNo单据号
                        if (serialNoMapList.size() > 1){
                            //不存在一种项目号
                            for (int i = 0; i < serialNoMapList.size(); i++) {
                                //从下一个单元格开始合并
                                serialCount=baseCount+1;
                                Map<String, List<ProductItemDto>> serialNoMap = serialNoMapList.get(i);
                                Set<Map.Entry<String, List<ProductItemDto>>> entries = serialNoMap.entrySet();
                                for (Map.Entry<String, List<ProductItemDto>> entry : entries) {
                                    List<ProductItemDto> productItemDtoList = entry.getValue();
                                    for (int i1 = 0; i1 < productItemDtoList.size(); i1++) {
                                        baseCount++;
                                    }
                                }
                                //当行数不止一条的时候
                                if (serialCount==baseCount){
                                    continue;
                                }else {
                                    //存在不止一种serialNo的数据,每次遍历完之后就需要合并
                                    CellRangeAddress cra = new CellRangeAddress(serialCount, baseCount, 3, 3);
                                    sheet.addMergedRegion(cra);
                                    setCellStyle(hssfCellStyle, sheet, cra);
                                }
                            }
                        }else {
                            //只存在一个serialNo的数据
                            serialCount=baseCount+1;
                            Map<String, List<ProductItemDto>> serialNoMap = serialNoMapList.get(0);
                            Set<Map.Entry<String, List<ProductItemDto>>> entries = serialNoMap.entrySet();
                            for (Map.Entry<String, List<ProductItemDto>> entry : entries) {
                                List<ProductItemDto> productItemDtoList = entry.getValue();
                                for (int i = 0; i < productItemDtoList.size(); i++) {
                                    baseCount++;
                                }
                            }
                            //合并serialNoCount单元格
                            if (serialCount==baseCount){
                                continue;
                            }else {
                                //只有一种serialNo类型的数据
                                CellRangeAddress cra = new CellRangeAddress(serialCount, baseCount, 3, 3);
                                sheet.addMergedRegion(cra);
                                setCellStyle(hssfCellStyle, sheet, cra);
                            }
                        }
                    }
                    //合并projectNo单元格
                    if (projectCount==baseCount){
                        continue;
                    }else {
                        CellRangeAddress cra = new CellRangeAddress(projectCount, baseCount, 2, 2);
                        sheet.addMergedRegion(cra);
                        setCellStyle(hssfCellStyle, sheet, cra);
                    }
                }
            }
            //只有一种时间类型,直接合并
            if (timeCount==baseCount){
                log.info("product-->只有一种时间类型");
            }else {
                CellRangeAddress cra = new CellRangeAddress(timeCount, baseCount, 1, 1);
                sheet.addMergedRegion(cra);
                setCellStyle(hssfCellStyle, sheet, cra);
            }
        }

        //合并种类
        if (typeCount==baseCount){
            log.info("种类单元格,只有一条数据不需要合并");
        }else {
            CellRangeAddress cra = new CellRangeAddress(typeCount, baseCount, 0, 0);
            sheet.addMergedRegion(cra);
            setCellStyle(hssfCellStyle, sheet, cra);
        }

        //合并合计单元格
        CellRangeAddress cra = new CellRangeAddress(baseCount+1, baseCount+1, 0, 6);
        sheet.addMergedRegion(cra);
        setCellStyle(hssfCellStyle, sheet, cra);
        //返回baseCount数据
        return ++baseCount;
    }

最后插入数据:
注意这几条数据变化情况
timeRowCount++;
projectNoRowCount++;
serialNORowCount++;
baseCount++;

//将数据封装成大map的形式
    private Integer getExcelModel(Map<String,List<Map<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>>>> map, Map<String, Double> goodsTotalMap,HSSFCellStyle hssfCellStyle, HSSFWorkbook hw, HSSFSheet sheet,Integer baseCount,String typeName) {
        //用来计数,循环多少次
        int serialNORowCount = 0;
        int projectNoRowCount = 0;
        int timeRowCount = 0;

        //设置种类
        HSSFRow row1 = sheet.createRow(baseCount+1);
        HSSFCell cell = row1.createCell(0);
        cell.setCellValue(typeName);
        cell.setCellStyle(hssfCellStyle);
        //设置完样式之后开始插入数据
        //遍历timeMap
        //行列数重新置零
        int timeCount = baseCount + 1;
        int projectNoCount = baseCount + 1;
        int serialNoCount = baseCount + 1;
        List<Map<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>>> timeMapList = map.get(typeName);
            for (int i = 0; i < timeMapList.size(); i++) {
                Map<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>> timeMap = timeMapList.get(i);
                Set<Map.Entry<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>>> entrySetTime = timeMap.entrySet();
                for (Map.Entry<String, List<Map<String, List<Map<String, List<ProductItemDto>>>>>> entryTime : entrySetTime) {
                    //遍历timeMap集合
                    String timeKey = entryTime.getKey();
                    List<Map<String, List<Map<String, List<ProductItemDto>>>>> projectMapList = entryTime.getValue();
                    for (int i1 = 0; i1 < projectMapList.size(); i1++) {
                        Map<String, List<Map<String, List<ProductItemDto>>>> projectMap = projectMapList.get(i1);
                        //遍历projectMap集合
                        Set<Map.Entry<String, List<Map<String, List<ProductItemDto>>>>> entrySetProject = projectMap.entrySet();
                        for (Map.Entry<String, List<Map<String, List<ProductItemDto>>>> entryProject : entrySetProject) {
                            String projectKey = entryProject.getKey();
                            List<Map<String, List<ProductItemDto>>> serialNoMapList = entryProject.getValue();
                            for (int i2 = 0; i2 < serialNoMapList.size(); i2++) {
                                Map<String, List<ProductItemDto>> serialNoMap = serialNoMapList.get(i2);
                                Set<Map.Entry<String, List<ProductItemDto>>> entrySetSerialNo = serialNoMap.entrySet();
                                //遍历serialNoMap集合
                                for (Map.Entry<String, List<ProductItemDto>> entrySerialNo : entrySetSerialNo) {
                                    String serialNoKey = entrySerialNo.getKey();
                                    List<ProductItemDto> productItemDtoList = entrySerialNo.getValue();
                                    for (int i3 = 0; i3 < productItemDtoList.size(); i3++) {
                                        timeRowCount++;
                                        projectNoRowCount++;
                                        serialNORowCount++;
                                        baseCount++;
                                        //判断创建的列是否存在
                                        if (sheet.getRow(baseCount)!=null){
                                            //存在的话,直接插入数据
                                            HSSFRow row2 = sheet.getRow(baseCount);
                                            HSSFCell cell4 = row2.createCell(4);
                                            cell4.setCellValue(productItemDtoList.get(i3).getSupply());
                                            cell4.setCellStyle(hssfCellStyle);
                                            HSSFCell cell5 = row2.createCell(5);
                                            cell5.setCellValue(productItemDtoList.get(i3).getTotal());
                                            cell5.setCellStyle(hssfCellStyle);
                                            HSSFCell cell6 = row2.createCell(6);
                                            cell6.setCellValue(productItemDtoList.get(i3).getBatchCode());
                                            cell6.setCellStyle(hssfCellStyle);
                                        }else {
                                            //创建新的列对象
                                            HSSFRow row2 = sheet.createRow(baseCount);
                                            HSSFCell cell4 = row2.createCell(4);
                                            cell4.setCellValue(productItemDtoList.get(i3).getSupply());
                                            cell4.setCellStyle(hssfCellStyle);
                                            HSSFCell cell5 = row2.createCell(5);
                                            cell5.setCellValue(productItemDtoList.get(i3).getTotal());
                                            cell5.setCellStyle(hssfCellStyle);
                                            HSSFCell cell6 = row2.createCell(6);
                                            cell6.setCellValue(productItemDtoList.get(i3).getBatchCode());
                                            cell6.setCellStyle(hssfCellStyle);
                                        }
                                    }
                                    //因为从右到左插入,肯定有数据,row已经创建可以直接获取
                                    HSSFRow row2 = sheet.getRow(serialNoCount);
                                    HSSFCell cell3 = row2.createCell(3);
                                    cell3.setCellValue(serialNoKey);
                                    //用于记录serial中有多少个数据rowCount
                                    serialNoCount+=serialNORowCount;
                                    cell3.setCellStyle(hssfCellStyle);
                                    //每次遍历完成之后都需要置位为0,不然下次会出问题
                                    serialNORowCount=0;
                                }
                            }
                            HSSFRow row2 = sheet.getRow(projectNoCount);
                            HSSFCell cell2 = row2.createCell(2);
                            cell2.setCellValue(projectKey);
                            projectNoCount+=projectNoRowCount;
                            cell2.setCellStyle(hssfCellStyle);
                            projectNoRowCount=0;
                        }
                    }
                    HSSFRow row2 = sheet.getRow(timeCount);
                    HSSFCell cell1 = row2.createCell(1);
                    cell1.setCellValue(timeKey);
                    timeCount+=timeRowCount;
                    cell1.setCellStyle(hssfCellStyle);
                    timeRowCount=0;
                }
            }
        //设置总记录数
        HSSFRow rowTotal = sheet.createRow(++baseCount);
        HSSFCell cellTotal = rowTotal.createCell(0);
        Double total = goodsTotalMap.get("total");
        //对取出的total处理,保留三位有效数字
        Double totalCount = new Double(Math.ceil(total*1000))/1000.0;

        //这里只对总计操作
        for (int i = baseCount;i<baseCount+1;i++){
            HSSFRow row = sheet.getRow(i);
            for (int j = 0;j <= 6;j++){
                if (row.getCell(j)==null){
                    HSSFCell cell1 = row.createCell(j);
                }
                HSSFCell cell1 = row.getCell(j);
                cell1.setCellValue("");
                cell1.setCellStyle(hssfCellStyle);
            }
            cellTotal.setCellValue("总计         " + totalCount);
        }
        return baseCount;
    }

最后给大家看一下效果:
在这里插入图片描述
祝大家工作生活愉快!!。本人第一次写文章,可能很多地方不是很清楚,逻辑也比较混乱,望理解。

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值