怎么样将一堆后缀为.XLSX的EXCEL文件中的某个SHEET中的内容和格式复制到另外一个EXCEL文件中,尝试过自己写,代码无运行错误但是导出来文件都不能打开
可以复制数据和行高列宽,样式不行:
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();
}
}
}
谢谢你,但是我这里的需求是需要保存格式的,我已经想到了解决办法,但是有一个问题我用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: 你没有保存修改,照我的写:
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();
百度一大推吧,有问题debug一下看是什么问题一步步调试
要是我能百度到我就不在这里问了
@JohnZhangEX: 那你直接FIle.Copy整个excel,然后删除不需要的sheet
@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();
@JohnZhangEX: 不要直接修改原来的excel会有问题,将workbook保存到新的filestream就行了
你至少贴出错误信息或者导出代码
把你代码贴出来看看