java 向excel中追加,删除数据(备忘录)

本文提供了一个Java程序示例,展示了如何使用Apache POI库向现有的Excel文件中追加数据及如何删除指定行。该示例包括了创建新行、填充单元格数据的具体步骤。

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

import java.io.FileInputStream;  
import java.io.FileOutputStream;  
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;  

/**
 * 向d://test.xls中追加内容,(前提是:必须已经存在字段列头,可以没有内容)
 * 
 */
public class TestExceL{  

	public static void main(String[] args) throws Exception {  
		FileInputStream fs=new FileInputStream("d://test.xls");  //获取d://test.xls
		POIFSFileSystem ps=new POIFSFileSystem(fs);  //使用POI提供的方法得到excel的信息
		HSSFWorkbook wb=new HSSFWorkbook(ps);  
		HSSFSheet sheet=wb.getSheetAt(0);  //获取到工作表,因为一个excel可能有多个工作表
		HSSFRow row=sheet.getRow(0);  //获取第一行(excel中的行默认从0开始,所以这就是为什么,一个excel必须有字段列头),即,字段列头,便于赋值
		System.out.println(sheet.getLastRowNum()+" "+row.getLastCellNum());  //分别得到最后一行的行号,和一条记录的最后一个单元格
		
		FileOutputStream out=new FileOutputStream("d://test.xls");  //向d://test.xls中写数据
		row=sheet.createRow((short)(sheet.getLastRowNum()+1)); //在现有行号后追加数据
		row.createCell(0).setCellValue("leilei"); //设置第一个(从0开始)单元格的数据
		row.createCell(1).setCellValue(24); //设置第二个(从0开始)单元格的数据

		
		out.flush();
		wb.write(out);  
		out.close();  
		System.out.println(row.getPhysicalNumberOfCells()+" "+row.getLastCellNum());  
	}  
} 

 所需要的poi的jar包

 

删除指定行

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;


public class DelExcel {

	public static void main(String[] args) {
		/**
		 * @param args
		 */
		try{

			FileInputStream is = new FileInputStream("d://test.xls");

			HSSFWorkbook workbook = new HSSFWorkbook(is);

			HSSFSheet sheet = workbook.getSheetAt(0);

			sheet.shiftRows(1, 1, 1); //删除第4行

			FileOutputStream os = new FileOutputStream("d://test.xls");

			workbook.write(os);

			is.close();

			os.close();

		} catch(Exception e) { 

			e.printStackTrace();
		}
	}
}

 

本文章内容转自以下地址,本文章只用于备忘。

追加请参见 http://blog.youkuaiyun.com/goodleiwei/article/details/7247339

删除请参见 http://hi.baidu.com/bigheadsheep/blog/item/d474589d3e041f02d31b7053.html

<think>我们被要求使用C#向Excel文件追加数据。根据之前的引用,我们可以使用一些免费库来实现。常见的免费库有EPPlus(适用于.xlsx文件)和NPOI(适用于.xls和.xlsx)。由于引用[3]中使用了ExcelReaderFactory,这可能是来自ExcelDataReader库,但该库主要用于读取,写入功能有限。因此,我们选择EPPlus库,因为它支持写入和追加数据,并且操作简单。 步骤: 1. 安装EPPlus库(如果项目中没有,可以通过NuGet安装:Install-Package EPPlus) 2. 使用FileInfo对象指向Excel文件 3. 使用ExcelPackage打开文件 4. 获取目标工作表 5. 确定要追加数据的起始行(例如,在现有数据的最后一行之后) 6. 将新数据写入工作表 7. 保存 注意:EPPlus只支持.xlsx格式,不支持.xls格式。如果原文件是.xls,需要先转换为.xlsx。 示例代码: 假设我们要向一个名为“Sheet1”的工作表追加一行数据数据内容为一个字符串数组。 代码示例: ```csharp using OfficeOpenXml; using System.IO; // 设置LicenseContext(EPPlus 5以后需要) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 文件路径 string filePath = @"C:\path\to\your\file.xlsx"; // 创建一个FileInfo对象 FileInfo fileInfo = new FileInfo(filePath); // 使用ExcelPackage打开文件 using (ExcelPackage package = new ExcelPackage(fileInfo)) { // 获取工作表(假设名为"Sheet1") ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"]; if (worksheet == null) { // 如果工作表不存在,可以创建或处理错误 // 这里我们假设工作表存在 throw new Exception("工作表不存在"); } // 找到最后一行(有数据的行)的下一个行号 int nextRow = worksheet.Dimension == null ? 1 : worksheet.Dimension.End.Row + 1; // 假设新数据是一个字符串数组 string[] newData = { "Data1", "Data2", "Data3" }; // 将数据写入工作表 for (int col = 1; col <= newData.Length; col++) { worksheet.Cells[nextRow, col].Value = newData[col - 1]; } // 保存更改 package.Save(); } ``` 注意: - 如果文件不存在,上述代码会抛出异常。我们可以检查文件是否存在,如果不存在则创建新文件。 - 如果要追加多行数据,可以循环写入。 如果需要处理文件不存在的情况,可以这样修改: ```csharp if (!fileInfo.Exists) { // 创建一个新的Excel文件 using (ExcelPackage package = new ExcelPackage(fileInfo)) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1"); // 写入第一行数据(标题或数据) // 例如:worksheet.Cells[1,1].Value = "Column1"; ... // 然后追加数据 // 这里我们直接追加数据,因为文件是新创建的,所以从第一行开始 int nextRow = 1; string[] newData = { "Data1", "Data2", "Data3" }; for (int col = 1; col <= newData.Length; col++) { worksheet.Cells[nextRow, col].Value = newData[col - 1]; } package.Save(); } } else { // 使用之前的代码追加数据 // ... 上面的代码 } ``` 但是,上面的分支会导致重复代码。我们可以整合一下: ```csharp using OfficeOpenXml; using System.IO; // 设置LicenseContext ExcelPackage.LicenseContext = LicenseContext.NonCommercial; string filePath = @"C:\path\to\your\file.xlsx"; FileInfo fileInfo = new FileInfo(filePath); using (ExcelPackage package = new ExcelPackage(fileInfo)) { // 获取工作表,如果不存在则创建 ExcelWorksheet worksheet = package.Workbook.Worksheets.FirstOrDefault(ws => ws.Name == "Sheet1"); if (worksheet == null) { worksheet = package.Workbook.Worksheets.Add("Sheet1"); } // 确定起始行 int nextRow = worksheet.Dimension?.End?.Row + 1 ?? 1; // 如果Dimension为null,则从1开始 // 新数据 string[] newData = { "Data1", "Data2", "Data3" }; // 写入数据 for (int col = 1; col <= newData.Length; col++) { worksheet.Cells[nextRow, col].Value = newData[col - 1]; } package.Save(); } ``` 这样,无论文件是否存在,都能处理。 注意:如果文件存在但没有工作表“Sheet1”,则会创建该工作表。 另外,如果数据较大,可以使用`worksheet.Cells[nextRow, 1].LoadFromArrays`方法追加多行数据(要求数据为IEnumerable<object[]>),但这里我们只追加一行,所以用循环。 引用中提到的其他方法(如使用DataGridView转换)不适用于直接操作Excel文件追加数据,因此我们采用EPPlus。 如果用户需要处理.xls文件(旧格式),则可以考虑使用NPOI库,但代码会有所不同。 由于问题要求追加数据,我们提供了使用EPPlus追加到.xlsx文件的方案。 最后,注意EPPlus的版本,不同版本可能有差异。 相关问题: 1. 如何安装EPPlus库? 2. 如何处理不同格式的Excel文件(如.xls)? 3. 如何向Excel文件追加多行数据? 4. 如何设置单元格的样式(如字体、颜色)? 5. 如何读取Excel文件的数据?</think>### C# 向 Excel 文件追加数据的方法 在 C# 中向 Excel 文件追加数据,推荐使用 **EPPlus 库**(适用于 .xlsx 格式)或 **NPOI 库**(兼容 .xls/.xlsx)。以下是两种实现方案: --- #### 方案 1:使用 EPPlus(推荐 .xlsx 文件) ```csharp using OfficeOpenXml; using System.IO; // 设置 EPPlus 许可模式(非商业用途) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 文件路径 string filePath = @"C:\data\yourfile.xlsx"; // 追加数据Excel using (var package = new ExcelPackage(new FileInfo(filePath))) { // 获取工作表(假设名为 "Sheet1") ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"] ?? package.Workbook.Worksheets.Add("Sheet1"); // 计算最后一行位置(追加数据的起始行) int nextRow = worksheet.Dimension?.End.Row + 1 ?? 1; // 示例数据(可替换为实际数据) object[] newData = { "John", 28, DateTime.Now }; // 写入数据(逐列追加) for (int col = 1; col <= newData.Length; col++) { worksheet.Cells[nextRow, col].Value = newData[col - 1]; } // 保存文件 package.Save(); } ``` #### 方案 2:使用 NPOI(兼容 .xls/.xlsx) ```csharp using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; // .xlsx 文件 using NPOI.HSSF.UserModel; // .xls 文件 using System.IO; string filePath = @"C:\data\yourfile.xlsx"; // 判断文件类型 IWorkbook workbook; if (File.Exists(filePath)) { using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite)) { workbook = Path.GetExtension(filePath) == ".xlsx" ? new XSSFWorkbook(fs) : (IWorkbook)new HSSFWorkbook(fs); ISheet sheet = workbook.GetSheet("Sheet1") ?? workbook.CreateSheet("Sheet1"); // 获取最后一行索引 int lastRow = sheet.LastRowNum + 1; IRow newRow = sheet.CreateRow(lastRow); // 追加数据(示例:3列) newRow.CreateCell(0).SetCellValue("Lisa"); newRow.CreateCell(1).SetCellValue(32); newRow.CreateCell(2).SetCellValue(DateTime.Now.ToString()); // 保存 using (var newFs = new FileStream(filePath, FileMode.Create)) { workbook.Write(newFs); } } } ``` --- ### 关键注意事项 1. **文件格式**: - EPPlus 仅支持 `.xlsx`(Excel 2007+) - NPOI 支持 `.xls` 和 `.xlsx` 2. **性能优化**: - 批追加时使用 `LoadFromCollection`(EPPlus)或分批写入 - 避免频繁打开/关闭文件(集中操作后一次性保存) 3. **依赖安装**: ```bash # EPPlus Install-Package EPPlus -Version 5.8.8 # NPOI Install-Package NPOI -Version 2.6.2 ``` 4. **数据安全**: - 使用 `try-catch` 处理文件占用异常 - 验证数据格式(防止破坏 Excel 结构) > **提示**:若需从 `DataGridView` 追加数据,可先转换为 `DataTable`(参考引用[2]的方法),再循环写入 Excel。 --- ### 相关问题 1. 如何从 Excel 读取特定列的数据到 C# 对象? 2. 如何批追加数据(10万行+)到 Excel 而不导致内存溢出? 3. EPPlus 和 NPOI 在性能上有哪些差异?如何选择? 4. 如何向 Excel 追加数据时保留原有格式(如单元格颜色、公式)? 5. 如何将 `DataTable` 数据直接追加Excel 而不循环写入? [^1]: 引用自 C# 如何读取 Excel 文件 [^2]: 引用自 C# 操作 Excel 文件 [^3]: 引用自 C# 读取 Excel 数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值