使用VSTO复制部分Excel单元格(带格式),粘贴并保存到另一Excel文件中
2009-04-23 15:13
661 查看
最近使用VSTO做了一个小项目,其中有一个需求是将一个Excel工作表中的很多个带格式的区域,分别另存到单独的Excel文件中,要求保留源格式。
虽然需求很简单,但也有几个技术点要搞明白:
1.带格式复制,但只复制值和格式,不复制公式,引用,校验等等。
2.另存为Excel
第一个问题,开始我以为很简单,直接使用选择性粘贴,粘贴所有就行了,其实不是那么简单。开始使用如下代码:
ws.get_Range(beginCell, pasteRange).PasteSpecial
(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteAll,
Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
但发现复制出来的只是所有的值,格式都未复制出来。于是对Microsoft.Office.Interop.Excel.XlPasteType进行研究,发现有十几个选项,逐个试验,发现单独使用任何一个枚举都不能满足我的要求。后来灵机一动,使用了两次复制解决问题,一次复制值,一次复制格式!代码如下:
ws.get_Range(beginCell, pasteRange).PasteSpecial
(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteValues,
Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
ws.get_Range(beginCell, pasteRange).PasteSpecial
(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteFormats,
Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
再说第二个问题,也不难,主要是不同的对象模型使用的保存方法不同(前面的wb对象是Microsoft.Office.Interop.Excel.Workbook对象,之前实验过使用Microsoft.Office.Interop.Excel.ApplicationClass),经试验,Workbook对象的SaveCopyAs方法非常理想,因为它不会弹出任何对话框,自动覆盖之前存在的同名文件。
下面列出完整代码:
void creatCommand_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool
CancelDefault)
public static void CreatAndPaste(Excel.Application app,string pasteRange,string beginCell,string fileName)
{
//使用新的Excel进程添加一个新的工作簿
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(Type.Missing);
Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
//粘贴
ws.get_Range(beginCell, pasteRange).PasteSpecial(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteValues, Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, Type.Missing, Type.Missing);
ws.get_Range(beginCell, pasteRange).PasteSpecial(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteFormats, Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, Type.Missing, Type.Missing);
ws.get_Range(beginCell, pasteRange).Columns.AutoFit();
//保存
wb.SaveCopyAs(fileName);
//关闭工作簿
Clipboard.Clear();
wb.Close(false, Type.Missing, Type.Missing);
}
虽然需求很简单,但也有几个技术点要搞明白:
1.带格式复制,但只复制值和格式,不复制公式,引用,校验等等。
2.另存为Excel
第一个问题,开始我以为很简单,直接使用选择性粘贴,粘贴所有就行了,其实不是那么简单。开始使用如下代码:
ws.get_Range(beginCell, pasteRange).PasteSpecial
(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteAll,
Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
但发现复制出来的只是所有的值,格式都未复制出来。于是对Microsoft.Office.Interop.Excel.XlPasteType进行研究,发现有十几个选项,逐个试验,发现单独使用任何一个枚举都不能满足我的要求。后来灵机一动,使用了两次复制解决问题,一次复制值,一次复制格式!代码如下:
ws.get_Range(beginCell, pasteRange).PasteSpecial
(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteValues,
Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
ws.get_Range(beginCell, pasteRange).PasteSpecial
(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteFormats,
Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone,
Type.Missing, Type.Missing);
再说第二个问题,也不难,主要是不同的对象模型使用的保存方法不同(前面的wb对象是Microsoft.Office.Interop.Excel.Workbook对象,之前实验过使用Microsoft.Office.Interop.Excel.ApplicationClass),经试验,Workbook对象的SaveCopyAs方法非常理想,因为它不会弹出任何对话框,自动覆盖之前存在的同名文件。
下面列出完整代码:
void creatCommand_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool
CancelDefault)
public static void CreatAndPaste(Excel.Application app,string pasteRange,string beginCell,string fileName)
{
//使用新的Excel进程添加一个新的工作簿
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(Type.Missing);
Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
//粘贴
ws.get_Range(beginCell, pasteRange).PasteSpecial(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteValues, Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, Type.Missing, Type.Missing);
ws.get_Range(beginCell, pasteRange).PasteSpecial(Microsoft.Office.Interop.Excel.XlPasteType.xlPasteFormats, Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, Type.Missing, Type.Missing);
ws.get_Range(beginCell, pasteRange).Columns.AutoFit();
//保存
wb.SaveCopyAs(fileName);
//关闭工作簿
Clipboard.Clear();
wb.Close(false, Type.Missing, Type.Missing);
}
相关文章推荐
- 使用VSTO复制部分Excel单元格(带格式),粘贴并保存到另一Excel文件中
- vi 保存复制内容格式粘贴
- jsp导出excel文件并设定单元格格式
- VBA学习笔记2-文件打开、保存、备份、关闭等;工作表选取、删除、移动等;单元格定位、格式、合并等
- MFC 使用CImage获取到屏幕截图,指定格式保存到文件
- Excel如何复制粘贴筛选后的单元格
- Excel之按原格式复制粘贴工作表
- 使用C#和Excel进行报表开发(七)-设置单元格的显示格式
- C# 使用Excel模板复制单元格
- c#(winform,webform通用)利用npoi将xls文件复制为xlsx文件(excel的修改,保存,包括excel2003-office2007+的处理)
- Python使用xlrd读取Excel格式文件的方法
- jsp导出excel文件并设定单元格格式
- 使用PHPExcel导入导出excel格式文件
- 使用C#和Excel进行报表开发(四)-复制单元格
- c#第三次作业 C#读取Excel文件,并保存成HTML格式
- 使用 PHP 输出带格式的 Excel 文件
- 使用C#和Excel进行报表开发(四)-复制单元格
- VC中如何将文件保存为EXCEL格式(CSpreadSheet)
- 使用FFMPEG编码保存MPEG-1/MPEG-2文件格式
- C# 保存Excel文件 ( 打开Excel文件格式与扩展名指定格式不一致)