跨工作薄复制Sheet,并不是单纯的将Sheet的数据复制到新Sheet中,需要将数据、公式等包括数据格式(DataFormat),单元格的风格(CellStyle)等等都复制到新Sheet中。
NPOI目前的版本为2.5.1,其Excel处理已经可以较好的支持XSSF(2007及以上)与HSSF(2003及以下)各自的工作薄间的Sheet拷贝,但XSSF工作薄与HSSF工作薄间的Sheet拷贝仍未实现。而2.4.1版的HSSF的Sheet拷贝也并未完善,虽然大部分功能已实现,颜色上有异常,2.5.1版已正常。为了处理各种情况下的Sheet的拷贝,网上有比较多的示例,比较成功的示例虽然有所不同但处理方式大同小异,有些处理考虑也有不到的地方。可参考:NPOI中如何复制Sheet,poi操作excel,复制sheet,复制行,复制单元格。由于某些原因,此处只考虑NPOI 2.4.1的版本下的处理,某些不同的版本可能会有些不同。
处理思路:Sheet的复制主要考虑的就是单元格Cell,分Cell的数据与风格。数据处理网上有许多成功示例,请自寻不赘述。风格处理包括:单元格的各种情况,其中重点是字体与颜色的处理(私设:这也是目前NPOI未解决得好的原因吧 :-p )。本人参考了许多示例,Sheet复制已经能够基本解决,但一直未能处理好颜色情况(包括字体颜色),注意:此处指HSSF与XSSF间的相互或自我复制的不同情况。以下出现的代码示例中,有关颜色部分被屏蔽,呵呵,虽未成功但一直努力中……如有哪位能够解决并提供代码的话,那么基本上NPOI的Sheet复制基本上就成功了。当然,仍然有其它的方面需要解决(如:Chart、Picture……),但对于一般的代码应用,估计差不多了吧。
不多说了……翠花,上酸菜——
public static class NPOIExt
{
/// <summary>
/// 跨工作薄Workbook复制工作表Sheet
/// </summary>
/// <param name="sSheet">源工作表Sheet</param>
/// <param name="dWb">目标工作薄Workbook</param>
/// <param name="dSheetName">目标工作表Sheet名</param>
/// <param name="clonePrintSetup">是否复制打印设置</param>
public static ISheet CrossCloneSheet(this ISheet sSheet, IWorkbook dWb, string dSheetName, bool clonePrintSetup)
{
ISheet dSheet;
dSheetName = string.IsNullOrEmpty(dSheetName) ? sSheet.SheetName : dSheetName;
dSheetName = (dWb.GetSheet(dSheetName) == null) ? dSheetName : dSheetName + "_拷贝";
dSheet = dWb.GetSheet(dSheetName) ?? dWb.CreateSheet(dSheetName);
CopySheet(sSheet, dSheet);
if (clonePrintSetup)
ClonePrintSetup(sSheet, dSheet);
dWb.SetActiveSheet(dWb.GetSheetIndex(dSheet)); //当前Sheet作为下次打开默认Sheet
return dSheet;
}
/// <summary>
/// 跨工作薄Workbook复制工作表Sheet
/// </summary>
/// <param name="sSheet">源工作表Sheet</param>
/// <param name="dWb">目标工作薄Workbook</param>
/// <param name="dSheetName">目标工作表Sheet名</param>
public static ISheet CrossCloneSheet(this ISheet sSheet, IWorkbook dWb, string dSheetName)
{
bool clonePrintSetup = true;
return CrossCloneSheet(sSheet, dWb, dSheetName, clonePrintSetup);
}
/// <summary>
/// 跨工作薄Workbook复制工作表Sheet
/// </summary>
/// <param name="sSheet">源工作表Sheet</param>
/// <param name="dWb">目标工作薄Workbook</param>
public static ISheet CrossClon