Java操作excel之poi

1. 创建Excel

1.1 创建新Excel工作簿

引入poi依赖

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->          
<dependency>                  
    <groupId>org.apache.poi</groupId>                  
    <artifactId>poi</artifactId>                  
    <version>5.2.3</version>          
</dependency>

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Workbook; 
import java.io.FileOutputStream;  
public class Demo01 {     
    public static void main(String[] args) throws Exception {         
        // 创建一个工作簿         
        Workbook wb = new HSSFWorkbook();         
        // 创建输出流         
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\java\\poi\\poi\\创建一个Excel工作簿.xls");         
        wb.write(fileOutputStream);         
        // 工作簿写出流         
        wb.close();     
    } 
}

运行代码

 1.2 创建新sheet页

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.ss.usermodel.Workbook;   
import java.io.FileOutputStream;   
public class Demo02 {          
    public static void main(String[] args) throws Exception {                  
        // 创建一个工作簿                  
        Workbook wb = new HSSFWorkbook();                  
        // 创建一个sheet页                  
        wb.createSheet("这是第一个sheet的名字");                  
        wb.createSheet("这是第二个sheet的名字");                  
        // 创建输出流                  
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\java\\poi\\poi\\创建sheet.xls");                  
        // 工作簿写出流                  
        wb.write(fileOutputStream);                  
        wb.close();          
    }  
}

运行代码

1.3 创建单元格

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.ss.usermodel.Row;  
import org.apache.poi.ss.usermodel.Sheet;  
import org.apache.poi.ss.usermodel.Workbook;   
import java.io.FileOutputStream;   
public class Demo03 {          
    public static void main(String[] args) throws Exception {                  
        // 创建一个工作簿                  
        Workbook wb = new HSSFWorkbook();                  
        // 创建一个sheet页                  
        Sheet sheet = wb.createSheet("这是第一个sheet的名字");                  
        // 创建单元格并设置内容                  
        // 创建第一行                  
        Row row = sheet.createRow(0);                  
        row.createCell(0).setCellValue(1); // 第一列          
        row.createCell(1).setCellValue(1.2); // 第二列            
        row.createCell(2).setCellValue("字符串"); // 第三列                
        // 创建输出流                  
        FileOutputStream fileOutputStream = new FileOutputStream("E:\\java\\poi\\poi\\创建sheet.xls");                
        // 工作簿写出流                  
        wb.write(fileOutputStream);               
        wb.close();        
    }  
}

运行代码

2. 创建时间格式单元格

2.1 创建一个时间格式的单元格

Java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;
import java.util.Date;

/**
 * @Description: 创建时间格式单元格
 * @author: lh
 */
public class Demo04 {
    public static void main(String[] args) throws Exception {
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(0);
        row.createCell(0).setCellValue(new Date());
        // 设置单元格日期格式
        CreationHelper creationHelper = workbook.getCreationHelper();
        CellStyle cellStyle = workbook.createCellStyle();// 单元格样式
        cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd hh:mm:ss"));
        Cell cell = row.createCell(1);
        cell.setCellValue(new Date());
        cell.setCellStyle(cellStyle);
        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

2.2 遍历工作簿的行和列并获取单元格内容

java代码

import org.apache.poi.hssf.usermodel.HSSFCell;
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.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;

/**
 * @Description: 遍历单元格
 * @author: lh
 */
public class Demo05 {
    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream = new FileInputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        POIFSFileSystem fs = new POIFSFileSystem(fileInputStream);
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fs);
        HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
        if (sheet == null) {
            return;
        }
        // 遍历row
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            HSSFRow row = sheet.getRow(i);
            if (row == null) {
                continue;
            }
            // 遍历cell
            for (int j = 0; j <= row.getLastCellNum(); j++) {
                if (row.getCell(j) == null) {
                    continue;
                }
                System.out.print(" " + getValue(row.getCell(j)));
            }
            System.out.println();
        }
    }

    /**
     * 获取不同类型单元格类型的值 
     * @param cell 单元格
     * @return 单元格内容
     */
    private static String getValue(HSSFCell cell) {
        switch (cell.getCellType()) {
            case NUMERIC:
                return Double.toString(cell.getNumericCellValue());
            case BOOLEAN:
                return Boolean.toString(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            case STRING:
                return cell.getStringCellValue();
            // Add cases for other cell types as needed...
            default:
                System.out.println("Unsupported cell type");
                return "";
        }
    }
}

运行结果

2.4 文本提取

Java代码

import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;

/**
 * @Description: 文本提取
 * @author: lh
 */
public class Demo06 {
    public static void main(String[] args) throws Exception {
        FileInputStream fileInputStream = new FileInputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        POIFSFileSystem fs = new POIFSFileSystem(fileInputStream);
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fs);

        ExcelExtractor excelExtractor = new ExcelExtractor(hssfWorkbook);
        excelExtractor.setIncludeSheetNames(false); //不需要sheet页
        System.out.println(excelExtractor.getText());
        fileInputStream.close();
        fs.close();
    }
}

运行结果 

3. 单元格处理

3.1 单元格对齐方式

Java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;

/**
 * @Description: 单元格对齐方式
 * @author: lh
 */
public class Demo07 {
    public static void main(String[] args) throws Exception {
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(0);
        row.setHeightInPoints(30);

        // 创建单元格对齐方式
        createCell(workbook, row, (short) 0, HorizontalAlignment.CENTER,  VerticalAlignment.CENTER, "单元格对齐方式1");
        createCell(workbook, row, (short) 1, HorizontalAlignment.LEFT, VerticalAlignment.BOTTOM,  "单元格对齐方式2");
        createCell(workbook, row, (short) 2, HorizontalAlignment.RIGHT, VerticalAlignment.TOP,  "单元格对齐方式3");

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }


    private static void createCell(Workbook workbook, Row row, short column, HorizontalAlignment align, VerticalAlignment valign, String value) {
        Cell cell = row.createCell(column);
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setAlignment(align);
        cellStyle.setVerticalAlignment(valign);
        cell.setCellValue(value);
        cell.setCellStyle(cellStyle);
    }
}

运行结果

3.2 单元格边框处理

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileOutputStream;

/**
 * @Description: 单元格边框处理
 * @author: lh
 */
public class Demo08 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);
        Cell cell = row.createCell(1);
        cell.setCellValue("单元格边框处理");

        // 单元格边框处理
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setBorderTop(BorderStyle.THIN); // 顶部边框样式
        cellStyle.setTopBorderColor(IndexedColors.RED.getIndex()); // 顶部边框颜色

        cellStyle.setBorderLeft(BorderStyle.MEDIUM); // 左边边框样式
        cellStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex()); // 左边边框颜色

        cellStyle.setBorderRight(BorderStyle.MEDIUM); // 右边边框样式
        cellStyle.setRightBorderColor(IndexedColors.GREEN.getIndex()); // 右边边框颜色

        cellStyle.setBorderBottom(BorderStyle.MEDIUM); // 底部边框样式
        cellStyle.setBottomBorderColor(IndexedColors.BROWN.getIndex()); // 底部边框颜色
        cell.setCellStyle(cellStyle);

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

3.3 单元格填充色和颜色操作

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.FileOutputStream;

/**
 * @Description: 设置单元格颜色
 * @author: lh
 */
public class Demo09 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);

        // 设置单元格颜色
        Cell cell = row.createCell(1);
        cell.setCellValue("单元格边框处理");
        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex()); //背景色
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cell.setCellStyle(cellStyle);

        Cell cell1 = row.createCell(2);
        cell1.setCellValue("单元格边框处理1");
        CellStyle cellStyle1 = workbook.createCellStyle();
        cellStyle1.setFillForegroundColor(IndexedColors.RED.getIndex()); //前景色
        cellStyle1.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        cell1.setCellStyle(cellStyle1);

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

3.4 单元格合并

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.FileOutputStream;

/**
 * @Description: 单元格合并
 * @author: lh
 */
public class Demo10 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);

        // 合并单元格
        Cell cell = row.createCell(1);
        cell.setCellValue("合并单元格");
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 3));

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

4. 字体处理

4.1 字体处理

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileOutputStream;

/**
 * @Description: 字体处理
 * @author: lh
 */
public class Demo11 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);

        // 创建一个字体处理类
        Font font = workbook.createFont();
        font.setFontHeightInPoints((short) 24);
        font.setFontName("宋体");
        font.setItalic(true);

        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setFont(font);
        Cell cell = row.createCell((short) 1);
        cell.setCellValue("hello world");
        cell.setCellStyle(cellStyle);

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

4.2 单元格中使用换行

java代码

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import java.io.FileOutputStream;

/**
 * @Description: 单元格换行
 * @author: lh
 */
public class Demo12 {
    public static void main(String[] args) throws Exception{
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("第一个sheet页");
        Row row = sheet.createRow(1);
        row.setHeightInPoints(30);

        Cell cell = row.createCell(2);
        cell.setCellValue("我要换行 \n 成功了吗?");
        CellStyle cellStyle = workbook.createCellStyle();
        // 设置可以换行
        cellStyle.setWrapText(true);
        cell.setCellStyle(cellStyle);

        FileOutputStream fileOutputStream = new FileOutputStream("/Users/lihui/Documents/Java/poi/工作簿.xls");
        workbook.write(fileOutputStream);
        workbook.close();
    }
}

运行结果

5. 综合示例

// excel导入	
@Transactional
public Result<?> import(Model model) throws IOException
{
    // 获取上传附件
    String attId = attachFileAppService.handleAttFiles(Collections.singletonList(model));
    if (StringUtil.isEmpty(attId))
    {
        throw new NormalRuntimeException(ModelCodeConstants.ATTACHMENT_LOST);
    }
    Workbook workbook = null;
    InputStream data = null;
    try
    {
        // 获取Excel文件流
        UploadAttachFileInfo uploadAttachFileInfo = attachFileAppService.downloadFile(attId);
        // 文件格式校验
        checkType(uploadAttachFileInfo);
        data = uploadAttachFileInfo.getData();
        workbook = ExcelUtils.getExcelWorkbook(data);
        Sheet sheet = workbook.getSheet(ModelCodeConstants."读取sheet的名字");
        if (CommonUtil.isEmpty(sheet))
        {
            return Result.fail(ModelCodeConstants.ERROR_TITLE);
        }
        // 表头检验
        checkTitle(sheet);
        // 空表检验
        if (sheet.getLastRowNum() == 0 && sheet.getPhysicalNumberOfRows() == 1)
        {
            return Result.fail(ModelCodeConstants.EMPTY_FILE);
        }
        // 数据导入- 从第四行开始
        int startRowIndex = 4;
        Iterator<Row> iterator = sheet.iterator();
        for (int i = 0; i < startRowIndex; i++)
        {
            iterator.next();
        }
        List<XXX> list = new ArrayList<>();
        List<XXX> errList = new ArrayList<>();
        while (iterator.hasNext())
        {
            Row row = iterator.next();
            String xxx = getValue(row.getCell(0));
            String yyy = getValue(row.getCell(1));
            String zzz = getValue(row.getCell(2));
            String aaa = getValue(row.getCell(3));
     
            // 导入数据规则校验
            StringJoiner joiner = new StringJoiner(",");
            checkBody(xxx, yyy, zzz, aaa, joiner);
            XXX err = new XXX();
            if (joiner.length() != 0)
            {
                err.setErrMsg(joiner);
             	// 错误信息添加
                errList.add(err);
            } else
            {
                XXX x = new XXX();
               	// 入库信息添加
                list.add(x);
                // 数据入库
                service.add();
            }
        }
        if (CommonUtil.isNotEmpty(errList))
        {
            //把原信息和错误信息写回去
            String uuid = writeErrExcel(errList);
            return Result.fail("数据导入不成功,点击下载错误信息!").setData(uuid);
        }
    } catch (Exception e)
    {
        e.printStackTrace();
        return Result.fail(e.getMessage());
    } finally
    {
        assert workbook != null;
        workbook.close();
        data.close();
    }
    return Result.success();
}

/**
* 文件格式校验 以xls或者xlsx结尾
*/
private static void checkType(UploadAttachFileInfo uploadAttachFileInfo)
{
    AttachFileInfo fileInfo;
    fileInfo = uploadAttachFileInfo.getFileInfo();
    if (!fileInfo.getFileName().endsWith(ModelCodeConstants.EXCEL_SUFFIX_XLS)
        && !fileInfo.getFileName().endsWith(ModelCodeConstants.EXCEL_SUFFIX_XLSX))
    {
        throw new NormalRuntimeException("文件格式有误!");
    }
}

/**
* 校验表头是否正确
*/
private static void checkTitle(Iterator<Row> rowIterator)
{
    Row headerRow = rowIterator.next();
    Cell xxxx = headerRow.getCell(0);
    Cell yyyy = headerRow.getCell(1);
    if (!"xxxx".equals(xxxx.getStringCellValue()) || !"yyyy".equals(yyyy.getStringCellValue()))
    {
        throw new NormalRuntimeException(ModelCodeConstants.ERROR_TITLE);
    }
}

/**
* 填写错误信息excel
*/
private String writeErrExcel(List<XXX> errList) throws Exception
{
    // 读取错误信息模板
    String rootPath = SpringContextConfig.getOptRootPath();
    String filePath = rootPath + FilePathConst.TEMPLATE_FILE_PATH + FileNameConst.WBS_CODE_ERROR_FILE_NAME;
    File file = ResourceUtils.getFile(filePath);
    InputStream inputStream = Files.newInputStream(file.toPath());

    // 处理导入错误信息数据
    Workbook workbook = ExcelUtils.getExcelWorkbook(inputStream);
    Sheet sheet = workbook.getSheet(ModelCodeConstants.TEMPLATE_ESTIMATE_DETAILS);
    int startRow = 4; // 从第五行开始写入数据
    CellStyle cellStyle = workbook.createCellStyle();
    cellStyle.setWrapText(true); // 自动换行
    for (int i = startRow; i < errList.size() + startRow; i++)
    {
        Row row = sheet.createRow(i);
        XXX rowData = errList.get(i - startRow); // 获取当前行数据
        String xxx = rowData.getLevel();
        String yyy = rowData.getWbsCode();
        String zzz = rowData.getWbsDescribe();
        String aaa = rowData.getWbsAmount();
        String errMsg = rowData.getErrMsg();
        row.createCell(0).setCellValue(xxx);
        row.createCell(1).setCellValue(yyy);
        row.createCell(2).setCellValue(zzz);
        row.getCell(2).setCellStyle(cellStyle);
        row.createCell(3).setCellValue(aaa);
        row.createCell(4).setCellValue(errMsg);
        row.getCell(4).setCellStyle(cellStyle);
    }
    // Excel文件写到目标路径下
    String uuid = CommonUtil.getUUID();
    String distPath = AttachServerConfig.AttachServerTempPath + "/" + FilePathConst.ERROR_FILE_PATH + "/" + uuid
        + "/" + FileNameConst.WBS_CODE_ERROR_FILE_NAME;
    ExcelWriter write = new ExcelWriter(sheet);
    write.setDestFile(new File(distPath));
    write.flush();
    write.close();
    InputStream distStream = new FileInputStream(distPath);
    uuid = attachFileAppService.uploadFile(distStream, FileNameConst.WBS_CODE_ERROR_FILE_NAME,
                                               FileModelTypeEnum.导入失败信息.getModel(), uuid, "xlsx");
    return uuid;
}

// 枚举常量类
public interface ModelCodeConstants
{
	public final String ATTACHMENT_LOST = "导入附件丢失或未找到,请重新上传!";
	
    public final String ERROR_TITLE = "表头信息错误,请使用标准模板文件导入!";
    
    public final String EMPTY_FILE = "上传文件内容为空,请确认!";
	
}
// excel工具类
public class ExcelUtils
{	
    /**
     * 读取工作区域,传入流文件
     * @param input
     * @return
     */
    public static Workbook getExcelWorkbook(InputStream input)
    {
        Workbook workbook = null;
        try
        {
            workbook = WorkbookFactory.create(input);
        } catch (EncryptedDocumentException | InvalidFormatException | IOException e)
        {
            e.printStackTrace();
        }
        return workbook;
    }
    
     /**
     * 获取不同类型单元格类型的值 
     * @param cell 单元格
     * @return 单元格内容
     */
    private static String getValue(HSSFCell cell) {
        switch (cell.getCellType()) {
            case NUMERIC:
                return Double.toString(cell.getNumericCellValue());
            case BOOLEAN:
                return Boolean.toString(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            case STRING:
                return cell.getStringCellValue();
            // Add cases for other cell types as needed...
            default:
                System.out.println("Unsupported cell type");
                return "";
        }
    }
}

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

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

相关文章

内测分发平台的未来发展和趋势如何

大家好&#xff0c;我是咕噜-凯撒&#xff0c;随着软件开发行业的快速发展和更新迭代的频率不断加快&#xff0c;内测分发平台作为软件测试和发布的重要环节&#xff0c;将在未来扮演更加关键的角色。未来内测分发平台发展将呈现出一系列的新趋势,都有哪些方面呢。图片来源:new…

Facebook像素的作用

Facebook像素是一种强大的工具&#xff0c;可以帮助企业在Facebook上进行精确的广告定位、跟踪和分析。Facebook像素的作用包括但不限于以下的几个方面&#xff0c;本文小编将对此介绍一下。 1、精准广告定位 Facebook像素能够跟踪用户在网站上的行为&#xff0c;例如浏览商品…

单链表在线OJ题二(详解+图解)

1.在一个排序的链表中&#xff0c;存在重复的结点&#xff0c;请删除该链表中重复的结点&#xff0c;重复的结点不保留&#xff0c;返回链表头指针 本题的意思是要删除链表中重复出现的节点&#xff0c;然后返回删除重复节点后的链表。 我们可以直接用一个哨兵位以便于观察链表…

并查集总结

并查集简介 并查集是一种可以动态维护若干个不重叠的结合&#xff0c;并支持合并与查询的数据结构 并查集是一种树状的数据结构&#xff0c;可以用于维护传递关系以及联通性。 并查集有两种操作&#xff1a; find&#xff1a;查询一个元素属于哪个集合merge:合并两个集合 模…

前端入门(二)Vue2基本语法、样式渲染、数据代理与监测

文章目录 Vue简介Vue的特点Hello, Vue Vue基本语法模板语法数据绑定&#xff08;v-bind、v-model&#xff09;el与data的两种写法 事件处理&#xff08;v-on:click / click&#xff09;事件修饰符键盘事件&#xff08;缺&#xff09; 计算属性与监视&#xff08;computed、watc…

利用叉积计算向量的旋向及折线段的拐向

一、向量叉积 两个向量 u u u、 v v v的叉积写作 u v n ∥ u ∥ ∥ v ∥ s i n θ \mathbf{u \times v n \left \| u \right \| \left \| v \right \| sin\theta } uvn∥u∥∥v∥sinθ 式中&#xff0c; n n n: 与 u u u、 v v v均垂直的单位向量&#xff0c;theta是两向量…

Apache配置文件详解

引言: Apache是一种功能强大的Web服务器软件,通过配置文件可以对其行为进行高度定制。对于初学者来说,理解和正确配置Apache的配置文件是非常重要的。本文将详细解释Apache配置文件的各个方面,并给出一些入门指南,帮助读者快速上手。 1、主配置文件(httpd.conf): 主…

uni-app 使用uni.getLocation获取经纬度配合腾讯地图api获取当前地址

前言 最近在开发中需要根据经纬度获取当前位置信息&#xff0c;传递给后端&#xff0c;用来回显显示当前位置 查阅uni-app文档&#xff0c;发现uni.getLocation () 可以获取到经纬度&#xff0c;但是在小程序环境没有地址信息 思考怎么把经纬度换成地址&#xff0c;如果经纬度…

10月起个税系统升级,3个月个税零申报将收到提示

近日&#xff0c;自然人电子税务局扣缴端升级了&#xff0c;升级后对于工资薪金收入连续三个月为零的纳税人&#xff0c;系统会自动出现以下提示。这个提示主要为了避免企业长期对已经离职的员工进行零申报&#xff0c;导致数据不准确和资源浪费。HR在申报个税时&#xff0c;一…

18.天气小案例

1►新增带Layout组件的页面 直接在views文件夹下面新增weather.vue。然后随便写一个123&#xff0c;现在先让我们页面能跳过去先。 让页面能跳过去&#xff0c;有好几种方法&#xff1a; 1、在菜单管理自己添加一个菜单&#xff0c;然后把菜单分配给某个角色&#xff0c;再把…

瑞吉外卖优化

1.缓存问题 用户数量多&#xff0c;系统访问量大频繁访问数据库,系统性能下降,用户体验差 2.导入依赖 和配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependenc…

线程安全

文章目录 观察线程安全问题线程安全的概念出现线程安全问题的原因共享数据原子性总结 synchronized - 锁synchronized 特性互斥可重入 synchronized 的使用修饰普通方法修饰静态方法修饰代码块 解决线程安全问题两个线程两把锁哲学家就餐问题 - N个线程M把锁解决策略 死锁成因总…

回归算法优化过程推导

假设存在一个数据集&#xff0c;包含工资、年龄及贷款额度三个维度的数据。我们需要根据这个数据集进行建模&#xff0c;从而在给定工资和年龄的情况下&#xff0c;实现对贷款额度的预测。其中&#xff0c;工资和年龄是模型构建时的两个特征&#xff0c;额度是模型输出的目标值…

【NLP】GPT 模型如何工作

介绍 2021 年&#xff0c;我使用 GPT 模型编写了最初的几行代码&#xff0c;那时我意识到文本生成已经达到了拐点。我要求 GPT-3 总结一份很长的文档&#xff0c;并尝试了几次提示。我可以看到结果比以前的模型先进得多&#xff0c;这让我对这项技术感到兴奋&#xff0c;并渴望…

Linux 磁盘/分区/修复 命令

目录 1. lsblk&#xff08;list block devices&#xff09; 2. fdisk&#xff08;fragment disk&#xff09; 3. gdisk 4. mkfs&#xff08;make filesystem&#xff09; 5. df&#xff08;display file-system disk space usage&#xff09; 6. du 7. fsck&#xff08;file-sy…

千帆Llama 2中文增强技术介绍--SFT,预训练,指令优化

目录 千帆Llama 2中文增强技术介绍 SFT&#xff0c;预训练&#xff0c;指令优化 千帆Llama 2中文增强技术介绍 SFT&#xff0c;预训练&#xff0c;指令优化

JavaScript中的继承

前言 继承 1.借用构造函数继承也叫经典继承 2.原型链继承 3.组合继承 1 2 1.经典继承 借用构造函数实现继承 // 创建父构造函数 function Animal(type,weight,age,length){this.type type;this.weight weight;this.age age;this.length length; }; Animal.prot…

一个工具让你明白“万丈高楼平地起”,拒绝重复造轮子!

大家在公司工作当中是不是很多时间装环境很麻烦&#xff0c;一个项目要上线了&#xff0c;开始网上搜了一边又一遍的环境搭建教程&#xff1f;等到下一个项目要上线了&#xff0c;又上网上搜了一边又一遍的环境搭建教程。关键天花乱坠的互联网&#xff0c;找不到很靠谱的呀。有…

Python数据分析30w人都在看

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

深入了解Performance API:优化网页性能的利器

在现代Web开发中&#xff0c;优化网页性能是至关重要的。用户对于加载速度和交互性能的要求越来越高&#xff0c;而Performance API作为一组用于测量和监控网页性能的JavaScript接口&#xff0c;为开发者提供了丰富的工具和信息。本文将深入探讨Performance API的各个方面&…