四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2627|回复: 0
打印 上一主题 下一主题

Microsoft.Office.Interop.Excel 操作类及方法

[复制链接]
  • TA的每日心情
    开心
    2018-11-9 08:52
  • 241

    主题

    691

    帖子

    7652

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    7652
    跳转到指定楼层
    楼主
    发表于 2016-11-23 14:50:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    ExportQuotationInspectionExcel 方法的作用是 根据strTmpFilePath 模板文件,替换掉其中的某些字符,然后重新生成一个新的文件 strOutputPath
    1. 文件路径为 绝对路径, 即 如 C:\PROGRAME\1.XLSX
    2. 新生成的excel 能够保留 模板中的 数据验证信息, 字体样式信息等
    3.此方法是通过逐个读取 excel 中的每个 cell 来 进行判断, 60 rows* 9 cols 的excel 大概要10秒才能导出完毕, 性能较差
    4.excel中range 可以是一个cell 也可以是多个cell 的组合区域,
    5.excel 所有数据的编号 都是从1 开始
    6. range 中的值不能局部替换,只能全部替换(还没找到局部替换的方法)

    1. public static bool ExportQuotationInspectionExcel(string strOutputPath, string strTmpFilePath, QuotationToJobEntity quotation)
    2. {
    3.     GC.Collect();  //垃圾回收  貌似没什么效果
    4.     Application excelApp = new ApplicationClass();  //定义excel  application
    5.     try
    6.     {

    7.         //打开excel
    8.         Microsoft.Office.Interop.Excel.Workbook workBook = excelApp.Workbooks.Open(strTmpFilePath, Missing.Value, Missing.Value,
    9.              Missing.Value, Missing.Value, Missing.Value,
    10.              Missing.Value, Missing.Value, Missing.Value,
    11.              Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value
    12.              );

    13.         workBook.Activate();
    14.         excelApp.Visible = false;  //设置 excel 的操作界面是否显示


    15.         //读取 sheet
    16.         if (workBook.Sheets.Count > 0)
    17.         {
    18.             var activeSheet = (_Worksheet)workBook.Sheets.get_Item(1);   //sheet的编号从1 开始,excel 所有编号都是从1 开始
    19.             //int intRows = activeSheet.Rows.Count;
    20.             //int intCols = activeSheet.Columns.Count;
    21.             int intRows = 47;
    22.             int intCols = 9;

    23.             var clientInfo = JobBusiness.GetClientByJobID(quotation.JobId);

    24.             var payer = JobBusiness.GetPayerCustomerEntityByJobID(quotation.JobId);
    25.             var payerContact = new ContactEntity(clientInfo.PayerContactId.HasValue?clientInfo.PayerContactId.Value:Guid.Empty);
    26.             var strPaymentTerms = AdminBusiness.GetDictionaryName(payer.PaymentTerms);
    27.             var fromPerson = new EmployeeEntity(quotation.ApproveEmployeeId.HasValue ? quotation.ApproveEmployeeId.Value : Guid.Empty);
    28.             var serviceToJobList = quotation.Job.ServiceToJob;
    29.             var strCurrencyName = CurrencyBusiness.GetCurrencyName(payer.Currency.HasValue ? payer.Currency.Value : Guid.Empty);
    30.             var strSampleReceiveDate = JobBusiness.GetSampleReceiveDates(quotation.JobId);
    31.             var arrayParameters = new List<ManualItem>
    32.                                       {
    33.                                         new ManualItem(){Name = "{QuotationNumber}",Value =quotation.QuotationNumber},
    34.                                         new ManualItem(){Name = "{CustomerName}",Value = payer.CustomerName},
    35.                                         new ManualItem(){Name = "{AttentionTo}",Value =payerContact.ContactName},
    36.                                         new ManualItem(){Name = "{AttentionEmail}",Value = payerContact.Email},
    37.                                         new ManualItem(){Name = "{FromPerson}",Value =fromPerson.FirstName+" "+fromPerson.LastName},  
    38.                                         new ManualItem(){Name = "{PrintDate}",Value = DateTime.Now.ToString(ApplicationConfiguration.DateFormat)},
    39.                                         new ManualItem(){Name = "{CurrencyName}",Value = strCurrencyName},
    40.                                            new ManualItem(){Name = "{SampleReceiveDate}",Value = strSampleReceiveDate},
    41.                                       };

    42.               // 逐行逐个 读取 cell, 并进行数据判断

    43.             for (int i = 9; i <= 23; i++)
    44.             {
    45.                 for (int j = 1; j <= intCols; j++)
    46.                 {
    47.                     foreach (var parameter in arrayParameters)
    48.                     {
    49.                         var rang = (Range)activeSheet.Cells[i, j];
    50.                         var tragetRange = rang.Find(parameter.Name, Missing.Value,    //找到含有对应参数的range
    51.                          XlFindLookIn.xlValues, XlLookAt.xlPart,
    52.                          XlSearchOrder.xlByRows, XlSearchDirection.xlNext, false,
    53.                          Missing.Value, Missing.Value);
    54.                         if (tragetRange != null)
    55.                         {
    56.                             //替换 range 内容
    57.                             tragetRange.Value2 = tragetRange.Value2.ToString().Replace(parameter.Name, parameter.Value);
    58.                         }
    59.                     }

    60.                 }
    61.             }


    62.             arrayParameters = new List<ManualItem>
    63.                                       {
    64.                                         new ManualItem(){Name = "{LeadTime}",Value = quotation.LeadTime},
    65.                                         new ManualItem(){Name = "{SampleReceivedQuantity}",Value =quotation.SampleQuantity},
    66.                                         new ManualItem(){Name = "{SupplementaryQuantity}",Value = quotation.SupplementQuantity},
    67.                                       };



    68.             for (int i = 48; i <= 51; i++)
    69.             {
    70.                 for (int j = 1; j <= intCols; j++)
    71.                 {
    72.                     foreach (var parameter in arrayParameters)
    73.                     {
    74.                         var rang = (Range)activeSheet.Cells[i, j];
    75.                         var tragetRange = rang.Find(parameter.Name, Missing.Value,
    76.                          XlFindLookIn.xlValues, XlLookAt.xlPart,
    77.                          XlSearchOrder.xlByRows, XlSearchDirection.xlNext, false,
    78.                          Missing.Value, Missing.Value);
    79.                         if (tragetRange != null)
    80.                         {

    81.                             tragetRange.Value2 = tragetRange.Value2.ToString().Replace(parameter.Name, parameter.Value);
    82.                         }
    83.                     }
    84.                 }
    85.             }

    86.             int intServiceCount = 0;
    87.             foreach (var serviceToJob in serviceToJobList)
    88.             {
    89.                 var intRow = 24 + intServiceCount;


    90.                 var rngServiceStandard = (Range)activeSheet.get_Range(activeSheet.Cells[intRow, 5], activeSheet.Cells[intRow, 6]);
    91.                 rngServiceStandard.Value2 = serviceToJob.Service.Standard + (serviceToJob.IfSubcontract ? "(*)" : "");

    92.                 var rngServicePrice = (Range)activeSheet.Cells[intRow, 7];
    93.                 rngServicePrice.Value2 = serviceToJob.Amount;

    94.                 var rngServiceQuantity = (Range)activeSheet.Cells[intRow, 8];
    95.                 rngServiceQuantity.Value2 = serviceToJob.Quantity;

    96.                 intServiceCount++;
    97.             }

    98.               intServiceCount = 0;
    99.               foreach (var sample in quotation.Job.Sample)
    100.               {
    101.                   var intRow = 24 + intServiceCount;
    102.                   var rngSampleReference = (Range) activeSheet.Cells[intRow, 1];
    103.                   rngSampleReference.Value2 = sample.SampleCode;

    104.                   var rngSampleDescription =
    105.                       (Range) activeSheet.get_Range(activeSheet.Cells[intRow, 2], activeSheet.Cells[intRow, 4]);
    106.                   rngSampleDescription.Value2 = sample.SampleName;
    107.               }

    108.            //生成新的文件

    109.             workBook.SaveAs(strOutputPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
    110.             //关闭原来的
    111.             workBook.Close(false, Missing.Value, Missing.Value);
    112.             workBook = null;
    113.             return true;
    114.         }
    115.     }
    116.     catch (Exception err)
    117.     {

    118.     }
    119.     finally
    120.     {
    121.         //清空
    122.         excelApp.Quit();
    123.         excelApp = null;
    124.         GC.Collect();
    125.     }
    126.     return false;
    127. }
    复制代码
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-5-8 02:12 , Processed in 1.062500 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表