zoukankan      html  css  js  c++  java
  • c#(winform,webform通用)利用npoi将xls文件复制为xlsx文件(excel的修改,保存,包括excel2003-office2007+的处理)

    1.程序界面

       每次需要处理excel文件的时候,都是去百度找方案,真是气一头火,今天好好总结一下,下次就不用度娘了。

       我是用winform来试验的,因为winform比较方便测试,实际上只要是在.net平台上,c#写的程序,都是通用的。

       

    2.所需dll下载地址

    npoi.zip  这里包含了所有所需要的dll文件,引入到项目中就可以了

    3.代码

       public void writeExcel(string readExcelPath, string writeExcelPath)
            {
                //需要读取的excel信息
                FileStream file = new FileStream(readExcelPath, FileMode.Open, FileAccess.Read);
                HSSFWorkbook book = new HSSFWorkbook(file);
                HSSFSheet sheet = (HSSFSheet)book.GetSheetAt(0);
    
                //需要写入的excel信息  XSSFWorkbook是处理xlsx即excel2007+以上文件的
                FileStream writeFile = new FileStream(writeExcelPath, FileMode.Open, FileAccess.Read);
                XSSFWorkbook writeBook = new XSSFWorkbook(writeFile);
                XSSFSheet writeSheet = (XSSFSheet)writeBook.GetSheetAt(0);
    
    
                for (int i = 0; i < sheet.LastRowNum + 1; i++)
                {
    //获取第i行,得到对象 IRow row = sheet.GetRow(i);
    //新建第i行,并返回得到的对象 IRow writeRow = writeSheet.CreateRow(i); for (int j = 0; j < row.LastCellNum+1; j++) { ICell cell = row.GetCell(j); if (cell == null) { break; }
    //这句话是设置单元格类型为string类型,否则如果单元格内容为numeric的话,会抛出异常 row.GetCell(j).SetCellType(CellType.STRING); string readValue = sheet.GetRow(i).GetCell(j).StringCellValue; if (string.IsNullOrEmpty(readValue)) { continue; } //新建第i行,第j列 writeRow.CreateCell(j); writeSheet.GetRow(i).GetCell(j).SetCellValue(readValue); textBox3.Text += readValue; } }
    //保存的地址,我做了处理,不让他保存在我选择的地址上,实际上不处理的话也没有问题 string savePath = textBox2.Text.Replace(".xlsx","_bak.xlsx"); FileStream saveFile = new FileStream(savePath, FileMode.Create);
    //将处理后的文件保存到新文件中去 writeBook.Write(saveFile); saveFile.Close(); file.Close(); MessageBox.Show("处理excel完毕"); }

    3.注意事项 

    ①HSSFWorkbook ,HSSFSheet是处理excel2003的,XSSFWorkbook,XSSFSheet是处理excel2007+的,切忌,一定不能少引用文件 
    ② IRow writeRow = writeSheet.CreateRow(i);这句话要放在第一层循环外面,要把IRow单独拿出来作为一个变量,然后在内层循环能调用,不然的话,会导致只复制到最后一列
    
    
    
    
    
    
    
    
    
    
    
    

       

  • 相关阅读:
    JAVA设计模式-设计原则
    java 8 stream特性
    使用跟踪标记查看过滤统计信息是否被使用
    找到SQL Server的序列号
    使用SSIS进行数据清洗
    找到SQL Server数据库历史增长信息
    如何查看某个查询用了多少TempDB空间
    SQL Server 2014云特性:无缝集成公有云
    SQL Server 2014新特性-原生备份加密
    强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
  • 原文地址:https://www.cnblogs.com/wjcnet/p/4279143.html
Copyright © 2011-2022 走看看