首页 新闻 会员 周边 捐助

如何利用NPOI操作.XLSX的EXCEL文件

0
悬赏园豆:15 [已解决问题] 解决于 2019-08-03 00:46

怎么样将一堆后缀为.XLSX的EXCEL文件中的某个SHEET中的内容和格式复制到另外一个EXCEL文件中,尝试过自己写,代码无运行错误但是导出来文件都不能打开

JohnZhangEX的主页 JohnZhangEX | 初学一级 | 园豆:149
提问于:2019-03-26 14:50
< >
分享
最佳答案
0

可以复制数据和行高列宽,样式不行:

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.IO;

namespace ConsoleCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            Office();

            Console.WriteLine("按下任意键退出");
            Console.Read();
        }

        static void Office()
        {
            //原始文件 都需要判断一下 文件是否存在
            FileStream fs = File.OpenRead("原始文件.xlsx");
            IWorkbook source = new XSSFWorkbook(fs);
            fs.Close();
            ISheet sourceSheet = source.GetSheet("Sheet1");//获取表 表需要存在
            source.Close();
            IRow sourceRow = sourceSheet.GetRow(0);//获取第一行
            int countCell = sourceRow.LastCellNum;//第一行最后一列,即是总列数

            //目标文件
            FileStream ft = new FileStream("目标文件.xlsx", FileMode.OpenOrCreate);
            IWorkbook target = new XSSFWorkbook(ft);
            ISheet targetSheet = target.CreateSheet("Sheet3");//创建新表 表名不可重复
            //ISheet targetSheet = target.GetSheet("Sheet20");
            for (int i = 0; i <= countCell; i++)//从第一列开始设置
            {
                targetSheet.SetColumnWidth(i, sourceSheet.GetColumnWidth(i));//设置列宽
            }
            IRow targetRow;
            ICell targetCell;

            for (int i = 0; i <= sourceSheet.LastRowNum; i++)//加上第一行
            {
                targetRow = targetSheet.CreateRow(i);
                targetRow.HeightInPoints = sourceSheet.GetRow(i).HeightInPoints;//设置行高 这个行高有加上表格边框宽度

                for (int j = 0; j < sourceSheet.GetRow(i).LastCellNum; j++)
                {
                    targetCell = targetRow.CreateCell(j);
                    //targetCell.CellStyle.CloneStyleFrom(sourceSheet.GetRow(i).GetCell(j).CellStyle);//赋值样式 这样写有问题 最后一列覆盖前面的了 其余表也会被覆盖
                    targetCell.SetCellValue(sourceSheet.GetRow(i).GetCell(j).ToString());//赋值 这里只赋值string 如果是其余类型 这里要判断
                }
            }

            var url = System.Environment.CurrentDirectory + "\\目标文件.xlsx";
            FileStream fs2 = File.Create(url);
            target.Write(fs2);//保存文件
            target.Close();
        }
    }
}
收获园豆:15
三人乐乐 | 老鸟四级 |园豆:4823 | 2019-03-27 11:39

谢谢你,但是我这里的需求是需要保存格式的,我已经想到了解决办法,但是有一个问题我用NPOI修改sheet名(xssfworkbook.setsheetname),结果导出来的文件的sheet表名称还是没有改变,这是为什么
FileStream f2 = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
XSSFWorkbook xssf = new XSSFWorkbook(f2);
xssf.SetSheetName(i, "sheet" + (i + 1));
xssf.Write(f2);
f2.Close();

JohnZhangEX | 园豆:149 (初学一级) | 2019-03-27 13:08

@JohnZhangEX: 你没有保存修改,照我的写:

var path = System.Environment.CurrentDirectory + "\\目标文件.xlsx";
FileStream f2 = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
XSSFWorkbook xssf = new XSSFWorkbook(f2);
xssf.SetSheetName(0, "sheet1");

FileStream fn = File.Create(path);//覆盖文件 这一段是关键
xssf.Write(fn);//然后保存新文件
xssf.Close();
f2.Close();
fn.Close();
三人乐乐 | 园豆:4823 (老鸟四级) | 2019-03-27 13:56
其他回答(4)
0

百度一大推吧,有问题debug一下看是什么问题一步步调试

jqw2009 | 园豆:2341 (老鸟四级) | 2019-03-26 14:59

要是我能百度到我就不在这里问了

支持(0) 反对(0) JohnZhangEX | 园豆:149 (初学一级) | 2019-03-26 15:00

@JohnZhangEX: 那你直接FIle.Copy整个excel,然后删除不需要的sheet

支持(0) 反对(0) jqw2009 | 园豆:2341 (老鸟四级) | 2019-03-26 15:03

@jqw2009: 我按照你说的可以达到效果,但是在我保存excel的时候我用NPOI修改sheet名,结果导出来的文件还是没有改变,这是为什么
FileStream f2 = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
XSSFWorkbook xssf = new XSSFWorkbook(f2);
xssf.SetSheetName(i, "sheet" + (i + 1));
xssf.Write(f2);
f2.Close();

支持(0) 反对(0) JohnZhangEX | 园豆:149 (初学一级) | 2019-03-27 11:18

@JohnZhangEX: 不要直接修改原来的excel会有问题,将workbook保存到新的filestream就行了

支持(0) 反对(0) jqw2009 | 园豆:2341 (老鸟四级) | 2019-03-27 15:05
0

你至少贴出错误信息或者导出代码

一禅·小和尚 | 园豆:519 (小虾三级) | 2019-03-26 15:11
0

可以用Free Spire.XLS复制
参考文章:
http://www.e-iceblue.cn/spirexls/copy-excel-worksheet.html

ms_doudou | 园豆:1170 (小虾三级) | 2019-03-26 15:15
0

把你代码贴出来看看

会长 | 园豆:12463 (专家六级) | 2019-03-26 15:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册