导出Excel(可以合并相同数据单元格)

本文介绍了一种使用Java和Apache POI库导出Excel并实现单元格合并的方法。通过示例代码展示了如何设置Excel文件的内容、样式及合并单元格的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pom.xml中

	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi</artifactId>
		<version>3.7</version>
	</dependency>
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-scratchpad</artifactId>
		<version>3.14</version>
	</dependency>

util工具类

package com.mdsw.dses.statistics.util;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.ss.util.CellRangeAddress;

public class ExcelUtilIndex {
	private ExcelUtilIndex() {
		 throw new IllegalStateException("Utility class");
	}
	   /**
     * @param fileName 文件名称
     * @param headers 表头
     * @param dataset 数据集
     * @param response HttpServletResponse
     * @param mergeBasis 合并基准列 可选
     * @param mergeCells 要合并的列 可选
     * @throws IOException
     */ 
    public static void exportExelMerge(String fileName,final String[] headers,List<String[]> dataset,HttpServletResponse response, final Integer[] mergeBasis, final Integer[] mergeCells) throws IOException{ 
        String title = "Sheet1"; 
        response.setContentType("application/vnd.ms-excel;charset=utf-8");  
        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8")); 
           
        createExcelMerge(title,headers,dataset,response.getOutputStream(),mergeBasis,mergeCells); 
           
        response.setStatus(HttpServletResponse.SC_OK); 
        response.flushBuffer(); 
    } 
       
    /**
     * @param fileName 文件名称
     * @param title 表头
     * @param dataset 数据集
     * @param out OutputStream
     * @param mergeBasis 合并基准列 可选
     * @param mergeCells 要合并的列
     */ 
    public static void createExcelMerge(String fileName,String[] title,List<String[]> dataset, OutputStream out, final Integer[] mergeBasis, final Integer[] mergeCells){ 
        HSSFWorkbook workbook = new HSSFWorkbook(); 
        HSSFSheet sheet = workbook.createSheet(fileName); 
           
        if(title == null || title.length <= 0){ 
            return; 
        } 
        
        HSSFRow row = sheet.createRow(0); // 产生表格标题行   
        for (int i = 0; i < title.length; i++) { 
            HSSFCell cell = row.createCell(i); 
            HSSFRichTextString text = new HSSFRichTextString(title[i]); 
            cell.setCellValue(text); 
        } 

        // 遍历集合数据,产生数据行   
        Iterator<String[]> it = dataset.iterator();   
        int index = 0;   
        while (it.hasNext()) { 
            index++;   
            row = sheet.createRow(index);   
            String[] dataSources = it.next() ; 
            for (int i = 0; i < dataSources.length; i++) {   
                HSSFCell cell = row.createCell(i);   
                cell.setCellValue(dataSources[i]); 
            } 
        }   
        try {   
            if(mergeBasis != null && mergeBasis.length > 0 && mergeCells != null && mergeCells.length > 0){ 
                for(int i = 0 ; i < mergeCells.length ; i++){ 
                    mergedRegion(sheet,mergeCells[i],1,sheet.getLastRowNum(),workbook,mergeBasis); 
                } 
            } 
            workbook.write(out);   
        } catch (IOException e) {   
            e.printStackTrace();   
        } finally { 
            try { 
                out.close(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
    }  
       
    /**
     * 合并单元格
     * @param sheet
     * @param cellLine
     * @param startRow
     * @param endRow
     * @param workbook
     * @param mergeBasis
     */ 
    private static void mergedRegion(HSSFSheet sheet, int cellLine,int startRow, int endRow, HSSFWorkbook workbook, Integer[] mergeBasis) { 
        String s_will = sheet.getRow(startRow).getCell(cellLine).getStringCellValue();  // 获取第一行的数据,以便后面进行比较   
        int count = 0;   
        Set<Integer> set = new HashSet<Integer>(); 
        CollectionUtils.addAll(set, mergeBasis); 
        for (int i = 2; i <= endRow; i++) {   
            String s_current = sheet.getRow(i).getCell(cellLine).getStringCellValue();   
            if (s_will.equals(s_current)) {  
                boolean isMerge = true; 
                if(!set.contains(cellLine)){//如果不是作为基准列的列 需要所有基准列都相同 
                    for(int j = 0 ; j < mergeBasis.length ; j++){ 
                        if(!sheet.getRow(i).getCell(mergeBasis[j]).getStringCellValue() 
                                .equals(sheet.getRow(i-1).getCell(mergeBasis[j]).getStringCellValue())){ 
                            isMerge = false; 
                        } 
                    } 
                }else{//如果作为基准列的列 只需要比较列号比本列号小的列相同 
                    for(int j = 0 ; j < mergeBasis.length && mergeBasis[j] < cellLine ; j++){ 
                        if(!sheet.getRow(i).getCell(mergeBasis[j]).getStringCellValue() 
                                .equals(sheet.getRow(i-1).getCell(mergeBasis[j]).getStringCellValue())){ 
                            isMerge = false; 
                        } 
                    } 
                } 
                if(isMerge){ 
                    count++; 
                }else{ 
                    sheet.addMergedRegion(new CellRangeAddress( startRow, startRow+count,cellLine , cellLine)); 
                    startRow = i;   
                    s_will = s_current; 
                    count = 0; 
                } 
            } else {   
                sheet.addMergedRegion(new CellRangeAddress( startRow, startRow+count,cellLine , cellLine));   
                startRow = i;   
                s_will = s_current; 
                count = 0; 
            }   
            if (i == endRow && count > 0) {   
                sheet.addMergedRegion(new CellRangeAddress(startRow,startRow+count ,cellLine , cellLine));   
            }   
        }   
    }
}

实体类

//不需要合并的类
public class AntibacterialDrugUse {
	
	/**属性1*/
    private String 属性1;

    /**属性2*/
    private String 属性2;

    /**属性3*/
    private String 属性3;

    /**属性4*/
    private String 属性4;

	/**属性5*/
    private String 属性5;

    /**需要合并的类*/
    private List<需要合并的类> adrugs;
}

Server层

public void exportExcel(String 条件, HttpServletResponse rep);

Server实现类

@Override
	public void exportExcel(String 条件1, HttpServletResponse rep) {
		String[] title =  { "列1","列2","列3","列4","列5","列6","列7","列8","列9","列10" };
		List<实体类> adu = aduMapper.selectData(条件1);
		List<String[]> dataset = new ArrayList<String[]>(); 
        for (不需要合并的实体类 adus : adu) {
        	for (需要合并的列实体类 aaa : adus.getAdrugs()) {
        		dataset.add(new String[] {
        				//不需要合并的列
        				adus.getClinicno(),adus.getVisitTime(),adus.getPatientName(),adus.getAge(),adus.getVisitDoctor(),
        				//需要合并的列
						aaa.getAntiName(),aaa.getDrugDose(),aaa.getDrugSpec(),aaa.getDrugCost().toString()}); 
			}
		}
        try {
        	ExcelUtilIndex.exportExelMerge("表.xls", title, dataset,rep, new Integer[]{0}, new Integer[]{0,1,2,3,4,5});
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}   
	}
<think>首先,用户的问题是:"我想解决Vue2项目中Networkunavailable的问题请问Vue2Networkunavailable解决方案"。这是一个关于Vue.js开发中常见的问题,其中在运行项目时,Network显示为unavailable,意味着无法通过本地网络访问项目。从系统级指令,我需要:-所有行内数学表达式用$...$格式(但在这个问题中,可能不涉及数学,所以可能不需要)。-独立公式用$$...$$(同样,可能不适用)。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在回答中引用的段落末尾添加引用标识,如[^1]。用户可见层的要求:-回答结构清晰,逐步解决问题。-保证回答真实可靠。参考的站内引用提供了几个解决方案:-引用[1]:提到了三种情况:多个网卡、配置host和public、系统环境变量问题。给出了在vue.config.js中配置devServer的方法。-引用[2]:类似,强调配置public字段和检查IP地址。-引用[3]:专注于系统环境变量,添加C:\Windows\System32\Wbem到Path。-引用[4]:再次提到在devServer中添加public。-引用[5]:建议在devServer中配置public和disableHostCheck。关键点总结:1.**多个网卡问题**:禁用多余的网络适配器。2.**配置host和public**:在vue.config.js文件中设置devServer的host和public。3.**系统环境变量问题**:添加C:\Windows\System32\Wbem到Path环境变量。我的回答应该结构清晰:-先解释问题:为什么Network显示unavailable?-然后分步给出解决方案。-确保解决方案可靠,基于引用。结构建议:1.**引言**:简述问题。2.**常见原因**:列出可能导致问题的原因。3.**解决方案**:分步骤详细说明。4.**验证**:如何确认问题解决。5.**相关问题**:生成几个相关问题。生成相关问题:-基于主题,例如:1.如何查找本机IP地址?2.Vue2项目中devServer的其他配置选项?3.如果环境变量修改无效,还有什么其他方法?确保使用中文回答。最终回答框架:-**问题描述**:Vue2项目运行npmrunserve后,Network显示unavailable,无法通过IP访问。-**原因分析**:通常由于网络配置、VuedevServer设置或系统环境问题。-**解决方案**:a.**检查网络适配器**:禁用多余网卡。b.**配置vue.config.js**:设置devServer的host和public。c.**修改环境变量**:添加Wbem路径到Path。-**步骤详解**:每一步给出具体操作。-**相关问题**:在末尾添加。引用标识:在引用内容后添加[^1],[^2]等,但引用是来自用户提供的,所以我应该引用那些内容。</think>### Vue2项目中Network: unavailable解决方案 在Vue2项目中运行`npm run serve`后出现**Network: unavailable**问题,表示项目无法通过本地网络IP访问(只能通过`localhost`访问)。这通常由网络配置冲突、Vue开发服务器设置不当或系统环境变量问题引起。以下是基于可靠实践的分步解决方案(参考社区常见修复方法[^1][^2][^3][^4][^5])。 --- ### 原因分析 - **多个网络适配器冲突**:电脑有多个网卡(如Wi-Fi、以太网、虚拟机网卡),导致Vue无法正确绑定IP[^1][^2]。 - **devServer配置缺失**:Vue的`devServer`未指定`public`字段或IP地址错误[^1][^4][^5]。 - **系统环境变量异常**:缺少`C:\Windows\System32\Wbem`路径,影响网络管理功能[^1][^3][^5]。 ### 分步解决方案 按照以下步骤操作,问题通常可解决(优先尝试方法1,若无效再逐步排查)。 #### 方法1: 配置Vue项目的devServer(推荐) 此方法直接修改Vue开发服务器设置,确保绑定正确IP。 1. **查找本机IP地址**: - 方法A:按`Win+R`,输入`cmd`打开命令提示符,执行`ipconfig`,找到`IPv4地址`(如`192.168.1.2`)[^2][^4]。 - 方法B:在“控制面板 > 网络和共享中心 > 网络连接”中查看活动网络的IPv4地址[^2]。 2. **修改vue.config.js文件**: -Vue项目根目录下创建或编辑`vue.config.js`文件。 - 添加以下配置(替换`public`值为你的IP和端口): ```javascript module.exports = { devServer: { host: '0.0.0.0', // 允许所有主机访问 public: '192.168.1.2:8080', // 改为你的IP和端口(如192.168.1.2:8080) port: '8080', // 端口号 https: false, // 禁用HTTPS disableHostCheck: true, // 关闭主机检查 open: false // 不自动打开浏览器 } }; ``` - **注意**:`public`字段必须与`ipconfig`显示的IP一致;如果网络切换(如从Wi-Fi换到热点),需更新IP[^2][^4][^5]。 3. **重启项目**: - 在VSCode终端运行: ```bash npm run serve ``` - 检查终端输出,Network应显示可用IP(如`http://192.168.1.2:8080`)。 #### 方法2: 禁用多余网络适配器 如果多个网卡导致冲突,精简网络配置。 1. 打开“控制面板 > 网络和共享中心 > 更改适配器设置”。 2. 禁用所有未使用的网络连接(如虚拟机网卡、蓝牙网络),只保留当前活动的连接(如Wi-Fi)[^1][^2]。 3. 重启VSCode并重新运行`npm run serve`。 #### 方法3: 修复系统环境变量 若上述无效,可能是系统Path变量缺失关键路径。 1. 打开环境变量设置: - `Win+R`输入`sysdm.cpl` → 高级 → 环境变量。 - 或在“设置 > 系统 > 高级系统设置”中找到[^3]。 2. 编辑系统变量: - 在“系统变量”列表中选择`Path` → 点击“编辑”。 - 添加新条目:`C:\Windows\System32\Wbem`(确保无拼写错误)[^1][^3][^5]。 3. 保存并重启: - 保存所有更改,重启电脑(或至少重启VSCode)。 - 重新运行项目,查看Network状态。 --- ### 验证问题解决 - **成功标志**:终端运行`npm run serve`后,Network显示类似`Network: http://192.168.1.2:8080`。 - **测试访问**:在同一局域网的手机或其他电脑,浏览器输入`http://<你的IP>:8080`,应能访问项目- **常见失败原因**: - IP地址错误:确保`public`字段IP与`ipconfig`一致[^4]。 - 防火墙阻拦:临时禁用防火墙测试。 - Vue版本问题:Vue CLI需更新至最新(运行`npm update -g @vue/cli`)。 > **注意**:这些方法基于Vue社区常见实践,成功率较高。如果问题持续,建议检查项目依赖(`npm install`)或操作系统更新[^1][^3][^5]。 --- ### 相关问题 1. **如何查找本机的准确IP地址?** 2. **Vue2的devServer还有哪些常用配置选项?** 3. **如果环境变量修复无效,还有什么其他解决方案?** 4. **Network: unavailable问题是否在Vue3中也存在?如何解决?** [^1]: 多个网卡原因或环境变量问题可能导致此错误,需禁用多余网络或添加Wbem路径到Path变量。 [^2]: 配置devServer的public字段是关键,IP地址需通过ipconfig或网络中心获取。 [^3]: 系统环境变量中添加C:\Windows\System32\Wbem可修复网络管理功能缺失。 [^4]: public字段必须与当前网络IP一致,切换网络后需更新。 [^5]: 在devServer中设置disableHostCheck: true有助于绕过主机检查。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值