示例#1
0
        /// <summary>
        /// 导出Excel设置
        /// </summary>
        /// <param name="source"></param>
        public bool ExportExcel(ResShowReport source, string dirName, string excelFileName)
        {
            bool success = false;

            //找到对应打印机才转换
            if (!SetDefaultPrinterByConfig())
            {
                Console.WriteLine("打印机恢复默认设置失败");
                return(false);
            }
            else
            {
                Console.WriteLine("打印机恢复默认设置成功");
            }
            Microsoft.Office.Interop.Excel.Application xlApp     = null;
            Microsoft.Office.Interop.Excel.Workbooks   workbooks = null;
            Microsoft.Office.Interop.Excel.Workbook    workbook  = null;
            Microsoft.Office.Interop.Excel.Worksheet   worksheet = null;
            //单元格对象
            Microsoft.Office.Interop.Excel.Range range = null;
            //用于存储excel进程id
            int processId = 0;

            try
            {
                if (source == null || source.patrol_header == null || source.patrol_detail_list == null)
                {
                    return(success);
                }
                System.Diagnostics.Process[] psf = null;
                System.Diagnostics.Process[] psa = null;
                //创建excel之前的列表
                lock (this._locker)
                {
                    psf   = System.Diagnostics.Process.GetProcessesByName("excel");
                    xlApp = new Microsoft.Office.Interop.Excel.Application();
                    //创建excel之后的列表
                    psa = System.Diagnostics.Process.GetProcessesByName("excel");
                }
                //取得进程id
                for (int i = 0; i < psa.Length; i++)
                {
                    //从旧集合中找出不同的
                    bool isexist = false;
                    for (int j = 0; j < psf.Length; j++)
                    {
                        if (psf[j].Id == psa[i].Id)
                        {
                            isexist = true;
                            break;
                        }
                    }
                    //新创建的excel进程
                    if (!isexist)
                    {
                        processId = psa[i].Id;
                        break;
                    }
                }
                if (xlApp == null)
                {
                    Console.WriteLine("Excel程序打开失败!");
                    return(success);
                }

                xlApp.DisplayAlerts = false;
                xlApp.Visible       = true;

                System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;

                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

                workbooks = xlApp.Workbooks;

                //Excel保存路径
                string strdir = String.Empty;
                string strurl = String.Empty;
                string strpdf = String.Empty;
                if (dirName != null && dirName != String.Empty)
                {
                    strurl = CommonInfo.ExcelUrl + "\\" + excelFileName + CommonInfo.ExcelExtend;
                    strpdf = CommonInfo.ExcelUrl + "\\" + excelFileName + CommonInfo.PDFExtend;
                    strdir = CommonInfo.ExcelUrl + "\\" + dirName;
                }
                else
                {
                    //未完成特巡报告书
                    return(success);
                }
                //复制模板
                if (System.IO.File.Exists(CommonInfo.ExcelTemplateFile))
                {
                    if (!System.IO.Directory.Exists(strdir))
                    {
                        System.IO.Directory.CreateDirectory(strdir);
                    }
                    //模板文件存在,那么复制模板文件到Excel导出文件夹
                    System.IO.File.Copy(CommonInfo.ExcelTemplateFile, strurl, true);
                }
                workbook = xlApp.Workbooks.Open(strurl);//workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);

                worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];

                ////必须在excel的visible为true时遍历进程 不然获取不到窗口标题名字标题,名字默认唯一
                //System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcessesByName("excel");
                //string strMainWindowTitle = "Microsoft Excel - " + workbook.Name;
                //foreach (System.Diagnostics.Process item in ps)
                //{
                //    Console.WriteLine("进程Id:" + item.MainWindowTitle);
                //    if (strMainWindowTitle == item.MainWindowTitle)
                //    {
                //        Console.WriteLine("关闭进程:" + item.Id);
                //        processId = item.Id;
                //    }

                //}


                #region 配置信息
                //计算可用宽度
                float OffSetX     = 20F;
                float OffSetY     = 10F;
                float ImageMargin = 60;//左右图片之间的间隔
                //开始单元格坐标和结束单元格坐标
                range = worksheet.get_Range("StartCell");
                double StartX           = range.Left;
                double StartY           = range.Top;
                int    StartRowIndex    = range.Row;
                int    StartColumnIndex = range.Column;
                range = worksheet.get_Range("EndCell");
                double EndX           = range.Left;
                double EndY           = range.Top;
                int    EndColumnIndex = range.Column;
                range = worksheet.get_Range("PrintBottom");//下一页的开始行
                double BottomX     = range.Left;
                double BottomY     = range.Top;
                int    EndRowIndex = range.Row;
                //图片开始坐标
                double ImageStartX   = OffSetX;
                double ImageStartY   = StartY;
                int    ImageStartRow = range.Row;
                range = worksheet.get_Range("Title");                                                                                                          //下一页的开始行
                double HeadTitleHeight = range.Height;                                                                                                         //标题行高度
                double ContainerWidth  = Convert.ToDouble((EndX - ImageMargin - OffSetX * 2).ToString("0.00"));                                                //容器的可用总宽度
                double ContainerHeight = Convert.ToDouble((BottomY - range.Top - OffSetY * 2 - HeadTitleHeight).ToString("0.00"));                             //容器的可用总高度
                //计算图片的长和宽以及间隙
                float ImageRowsPerPage    = 3;                                                                                                                 //一页打印3行
                float ImageColumnsPerPage = 2;                                                                                                                 //一行打印2列
                float TitleHeight         = 14;                                                                                                                //说明文字高度
                float RemarksHeight       = 36;                                                                                                                //备注文字高度
                float ImageWidth          = Convert.ToSingle(((ContainerWidth - ImageMargin) / 2).ToString("0.00"));                                           //图片宽度
                float ImageHeight         = Convert.ToSingle((ContainerHeight / ImageRowsPerPage - TitleHeight * 2 - RemarksHeight - 15.0F).ToString("0.00")); //图片高度

                //调整图片为正方形,取两者中小的那个作为基准,打印会重新设置图片的宽高所以需要按比例显示
                if (ImageWidth - ImageHeight > 0.001)
                {
                    ImageWidth = ImageHeight;
                }
                else
                {
                    ImageHeight = ImageWidth;
                }
                //重新定位图片坐标 使得图片居中显示
                OffSetX = Convert.ToSingle((EndX - ImageMargin) / 2 - ImageWidth);
                double ImageLeftX  = OffSetX;                                                          //左区域图片X坐标
                double ImageLeftY  = ImageStartY;                                                      //左区域图片Y坐标
                double ImageRightX = Convert.ToDouble((EndX - OffSetX - ImageWidth).ToString("0.00")); //右区域图片X坐标
                double ImageRightY = ImageLeftY;                                                       //右区域图片Y坐标
                int    RowsCount   = EndRowIndex - StartRowIndex;                                      //一页区域跨域的行数量
                //动态控制坐标变量
                float px = 0;
                float py = 0;
                List <Microsoft.Office.Interop.Excel.Range> listPages = new List <Microsoft.Office.Interop.Excel.Range>();
                //所有的图片
                List <Microsoft.Office.Interop.Excel.Shape> listShapes = new List <Microsoft.Office.Interop.Excel.Shape>();
                ////所有的说明文本框
                //List<Microsoft.Office.Interop.Excel.Shape> listTitleShapes = new List<Microsoft.Office.Interop.Excel.Shape>();
                ////所有的备注信息
                //List<Microsoft.Office.Interop.Excel.Shape> listRemarkShapes = new List<Microsoft.Office.Interop.Excel.Shape>();
                #endregion

                #region 第一页头部数据
                PatrolHeaderInfo header = source.patrol_header;
                //编号
                range             = worksheet.get_Range(RangeNames.ReportNo.ToString());
                range.FormulaR1C1 = header.patrol_no;
                //发行方
                range             = worksheet.get_Range(RangeNames.CompanyName.ToString());
                range.FormulaR1C1 = header.company_name;
                //发行日
                range             = worksheet.get_Range(RangeNames.PublishDate.ToString());
                range.FormulaR1C1 = header.publish_date;
                //二维码图片位置
                range             = worksheet.get_Range(RangeNames.Two.ToString());
                range.FormulaR1C1 = String.Empty;
                //添加图片
                worksheet.Shapes.AddPicture(CommonInfo.TwoFile, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, range.Left, range.Top, 64F, 64F);//Convert.ToSingle(range.Width * 2 + 5), Convert.ToSingle(range.Height * 3 + 5));
                //客户
                range             = worksheet.get_Range(RangeNames.Customer.ToString());
                range.FormulaR1C1 = "尊敬的   " + header.contactor_name + "   先生/女士/公司:";
                range.get_Characters(7, header.contactor_name.Length).Font.Size = 9;
                //检查概要
                range = worksheet.get_Range(RangeNames.Remarks.ToString());
                //range.ShrinkToFit = true;//缩小字体
                range.FormulaR1C1 = header.remarks;
                //机型代码
                range             = worksheet.get_Range(RangeNames.MachineType.ToString());
                range.FormulaR1C1 = header.machine_type + ":" + header.machine_name;
                //机号
                range             = worksheet.get_Range(RangeNames.MachineNo.ToString());
                range.FormulaR1C1 = header.machine_no;
                //当月运转小时(HR)
                range             = worksheet.get_Range(RangeNames.WorkedTimes.ToString());
                range.FormulaR1C1 = header.worked_times;
                //施工地点
                range             = worksheet.get_Range(RangeNames.WorkAddress.ToString());
                range.FormulaR1C1 = header.province + "" + header.city + "" + header.address;
                //作业人
                range             = worksheet.get_Range(RangeNames.WorkMan.ToString());
                range.FormulaR1C1 = header.reporter_name;
                //作业日期
                range             = worksheet.get_Range(RangeNames.WorkDate.ToString());
                range.FormulaR1C1 = header.report_date.Substring(0, 4) + "/" + header.report_date.Substring(4, 2) + "/" + header.report_date.Substring(6, 2);
                //机主
                range             = worksheet.get_Range(RangeNames.Owner.ToString());
                range.FormulaR1C1 = header.contactor_name;
                //机主电话
                range             = worksheet.get_Range(RangeNames.OwnerTel.ToString());
                range.FormulaR1C1 = header.contactor_phone;
                //现场联系人(管理员、顾客、操作手、其他)
                range             = worksheet.get_Range(RangeNames.OperatorTypeName.ToString());
                range.FormulaR1C1 = "现场联系人(" + header.operator_type_name + ")";
                //现场联系人名称
                range             = worksheet.get_Range(RangeNames.OperatorName.ToString());
                range.FormulaR1C1 = header.operator_name;
                //现场联系人(管理员、顾客、操作手、其他)电话
                range             = worksheet.get_Range(RangeNames.OperatorTypeTel.ToString());
                range.FormulaR1C1 = "(" + header.operator_type_name + ")电话";
                //电话内容
                range             = worksheet.get_Range(RangeNames.OperatorTel.ToString());
                range.FormulaR1C1 = header.operator_phone;

                #endregion

                #region 外观和铭牌信息
                //初始化
                px = 0;
                py = 0;
                //三张图片的间隔 (20171211修改只显示整机外观一张图片)
                float startPosition = Convert.ToSingle((EndX - ImageWidth) / 3); //30f; //左图起始位置
                float imageMargin   = 10F;                                       //Convert.ToSingle((EndX - ImageWidth * 3 - startPosition * 2) / 2);
                //单独控制长宽
                float decodeWidth  = Convert.ToSingle(ImageWidth + startPosition);
                float decodeHeight = Convert.ToSingle(ImageHeight + 50F);
                //外观图片单独处理
                List <Microsoft.Office.Interop.Excel.Shape> listDecode = new List <Microsoft.Office.Interop.Excel.Shape>();

                //电话内容
                //左边外观、右边铭牌
                foreach (PatrolDetailInfo item in source.facade_list)
                {
                    if (item.location_code == "SP0001")
                    {
                        //外观
                        //左边区域图片
                        range = worksheet.get_Range(RangeNames.Decode.ToString());
                        px    = startPosition;
                        py    = Convert.ToSingle(range.Top + 2.0F);
                    }
                    else if (item.location_code == "SP0002")
                    {
                        //铭牌
                        //中间区域图片
                        range = worksheet.get_Range(RangeNames.NamePlate.ToString());
                        px    = Convert.ToSingle(startPosition + ImageWidth + imageMargin);
                        py    = Convert.ToSingle(range.Top + 2.0F);
                    }
                    else
                    {
                        //铭牌
                        //右边区域图片
                        range = worksheet.get_Range(RangeNames.NamePlate.ToString());
                        px    = Convert.ToSingle(startPosition + (ImageWidth + imageMargin) * 2);
                        py    = Convert.ToSingle(range.Top + 2.0F);
                    }
                    //添加图片
                    Microsoft.Office.Interop.Excel.Shape shape = worksheet.Shapes.AddPicture(CommonInfo.ImageSaveUrl + "\\" + item.pic_url, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, px, py, decodeWidth, decodeHeight);
                    //图片固定大小和位置 不随单元格变化而变化
                    shape.Placement = Microsoft.Office.Interop.Excel.XlPlacement.xlFreeFloating;
                    //shape.IncrementLeft(0.75F);
                    //shape.ScaleWidth(0.9999F, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoScaleFrom.msoScaleFromTopLeft);
                    shape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                    shape.Line.ForeColor.ObjectThemeColor = Microsoft.Office.Core.MsoThemeColorIndex.msoThemeColorText1;
                    shape.Line.ForeColor.TintAndShade     = 0;
                    shape.Line.Transparency = 0;
                    //改成一张图片后大小不一样不加入调整控制
                    ////加入到控制集合中用于设置视图变化导致长宽不一致问题
                    //listShapes.Add(shape);
                    listDecode.Add(shape);
                    ////补齐数组
                    //listShapes.Add(shape);
                    //listShapes.Add(shape);
                    #region 整机外观不显示此信息
                    ////点检部位和具体位置
                    //shape = worksheet.Shapes.AddTextbox(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, px, py + ImageHeight, ImageWidth, TitleHeight);
                    ////图片固定大小和位置 不随单元格变化而变化
                    //shape.Placement = Microsoft.Office.Interop.Excel.XlPlacement.xlFreeFloating;
                    ////文字居中显示
                    //shape.TextFrame2.TextRange.ParagraphFormat.Alignment = Microsoft.Office.Core.MsoParagraphAlignment.msoAlignCenter;
                    //shape.TextFrame2.TextRange.Font.Bold = Microsoft.Office.Core.MsoTriState.msoTrue;
                    //shape.TextFrame2.TextRange.Font.Size = 10;
                    //shape.TextFrame2.VerticalAnchor = Microsoft.Office.Core.MsoVerticalAnchor.msoAnchorMiddle;
                    //if (item.question_level == PatrolEntity.QuestionLevel_Emergency)
                    //{
                    //    //点检状态为《需修理/更换》或者问题程度为紧急字体变红色
                    //    shape.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = 255;
                    //}
                    //shape.TextFrame2.TextRange.Characters.Text = item.spot_code_name;
                    //shape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                    //shape.Line.ForeColor.ObjectThemeColor = Microsoft.Office.Core.MsoThemeColorIndex.msoThemeColorText1;
                    //shape.Line.ForeColor.TintAndShade = 0;
                    //shape.Line.Transparency = 0;
                    ////加入到控制集合中用于设置视图变化导致长宽不一致问题
                    //listShapes.Add(shape);

                    ////问题程度和状态
                    //shape = worksheet.Shapes.AddTextbox(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, px, py + ImageHeight + TitleHeight, ImageWidth, TitleHeight);
                    ////图片固定大小和位置 不随单元格变化而变化
                    //shape.Placement = Microsoft.Office.Interop.Excel.XlPlacement.xlFreeFloating;
                    ////文字居中显示
                    //shape.TextFrame2.TextRange.ParagraphFormat.Alignment = Microsoft.Office.Core.MsoParagraphAlignment.msoAlignCenter;
                    //shape.TextFrame2.TextRange.Font.Bold = Microsoft.Office.Core.MsoTriState.msoTrue;
                    //shape.TextFrame2.TextRange.Font.Size = 10;
                    //shape.TextFrame2.VerticalAnchor = Microsoft.Office.Core.MsoVerticalAnchor.msoAnchorMiddle;
                    //if (item.question_level == PatrolEntity.QuestionLevel_Emergency)
                    //{
                    //    //点检状态为《需修理/更换》或者问题程度为紧急字体变红色
                    //    shape.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = 255;
                    //}
                    //shape.TextFrame2.TextRange.Characters.Text = item.question_level_name + ":" + item.status_name;
                    //shape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                    //shape.Line.ForeColor.ObjectThemeColor = Microsoft.Office.Core.MsoThemeColorIndex.msoThemeColorText1;
                    //shape.Line.ForeColor.TintAndShade = 0;
                    //shape.Line.Transparency = 0;
                    ////加入到控制集合中用于设置视图变化导致长宽不一致问题
                    //listShapes.Add(shape);
                    #endregion

                    //添加备注文字
                    shape = worksheet.Shapes.AddTextbox(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, px, py + decodeHeight, decodeWidth, RemarksHeight);
                    //图片固定大小和位置 不随单元格变化而变化
                    shape.Placement = Microsoft.Office.Interop.Excel.XlPlacement.xlFreeFloating;
                    //文字居左显示
                    shape.TextFrame2.TextRange.ParagraphFormat.Alignment         = Microsoft.Office.Core.MsoParagraphAlignment.msoAlignLeft;
                    shape.TextFrame2.TextRange.ParagraphFormat.BaselineAlignment = Microsoft.Office.Core.MsoBaselineAlignment.msoBaselineAlignTop;
                    shape.TextFrame2.TextRange.Font.Bold = Microsoft.Office.Core.MsoTriState.msoTrue;
                    shape.TextFrame2.TextRange.Font.Size = 8;
                    //shape.TextFrame2.MarginLeft = 0;
                    //shape.TextFrame2.MarginRight = 0;
                    //shape.TextFrame2.MarginBottom = 0;
                    //shape.TextFrame2.MarginTop = 0;
                    shape.TextFrame2.VerticalAnchor            = Microsoft.Office.Core.MsoVerticalAnchor.msoAnchorTop;
                    shape.TextFrame2.TextRange.Characters.Text = item.remarks;
                    shape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                    shape.Line.ForeColor.ObjectThemeColor = Microsoft.Office.Core.MsoThemeColorIndex.msoThemeColorText1;
                    shape.Line.ForeColor.TintAndShade     = 0;
                    shape.Line.Transparency = 0;
                    //加入到控制集合中用于设置视图变化导致长宽不一致问题
                    listDecode.Add(shape);
                }
                //设置第一个分页符位置
                range = worksheet.get_Range("StartCell");
                listPages.Add(range);
                worksheet.HPageBreaks.Add(range);
                #endregion

                #region 点检部位信息
                List <PatrolDetailInfo> detailList = source.patrol_detail_list;
                int pageIndex = 1;
                //遍历所有明细
                //for (int i = 0; i < detailList.Count; i++)
                for (int i = 0; i < detailList.Count; i++)
                {
                    //每页标题部分
                    //range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[StartRowIndex + 1, StartColumnIndex];
                    range            = worksheet.Range[worksheet.Cells[StartRowIndex + 3, StartColumnIndex], worksheet.Cells[StartRowIndex + 3, StartColumnIndex + 4]];
                    range.MergeCells = true;
                    //range.Interior.Color = 65535;//背景颜色黄色
                    range.HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlLeft;
                    range.VerticalAlignment   = Microsoft.Office.Interop.Excel.Constants.xlCenter;
                    //range.FormulaR1C1 = "检查" + detailList[i].location_code_name + "明细";
                    range.FormulaR1C1 = "<各部位点检情况>";
                    range.Font.Color  = -13434727;
                    range.Font.Bold   = true;
                    range.RowHeight   = HeadTitleHeight;
                    //每页图片左边开始区域坐标
                    range = worksheet.Range[worksheet.Cells[StartRowIndex, StartColumnIndex], worksheet.Cells[StartRowIndex + 1, EndColumnIndex - 1]];
                    float logoY = Convert.ToSingle(range.Top + 5.0F);
                    range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[StartRowIndex + 3, StartColumnIndex];
                    float logoHeight = Convert.ToSingle(range.Top - logoY - 3.0F);
                    //添加logo图片
                    worksheet.Shapes.AddPicture(CommonInfo.ExcelLogoFile, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, 0, logoY, Convert.ToSingle(EndX - 1.0F), logoHeight);

                    ImageLeftX = ImageLeftX;
                    ImageLeftY = range.Top;
                    //右边区域只要同步更新Y坐标即可
                    ImageRightY = range.Top;

                    //每页输出6张图片
                    for (int j = 0; j < ImageColumnsPerPage * ImageRowsPerPage; j++)
                    {
                        if (j % 2 == 0)
                        {
                            //左边区域图片
                            px = Convert.ToSingle(OffSetX.ToString("0.00"));
                            py = Convert.ToSingle((ImageLeftY + 8.0F + HeadTitleHeight).ToString("0.00"));
                            //Y坐标定位下一个左边区域
                            ImageLeftY += Convert.ToDouble((ImageHeight + TitleHeight * 2 + RemarksHeight + 10F).ToString("0.00"));
                        }
                        else
                        {
                            //右边区域图片
                            px = Convert.ToSingle(ImageRightX.ToString("0.00"));
                            py = Convert.ToSingle((ImageRightY + 8.0F + HeadTitleHeight).ToString("0.00"));
                            //Y坐标定位下一个左边区域
                            ImageRightY += Convert.ToDouble((ImageHeight + TitleHeight * 2 + RemarksHeight + 10F).ToString("0.00"));
                        }

                        //添加图片
                        Microsoft.Office.Interop.Excel.Shape shape = worksheet.Shapes.AddPicture(CommonInfo.ImageSaveUrl + "\\" + detailList[i].pic_url, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, Convert.ToSingle((px).ToString("0.00")), py, ImageWidth, ImageHeight);
                        //shape.IncrementLeft(0.75F);
                        //shape.ScaleWidth(1.0F, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoScaleFrom.msoScaleFromTopLeft);
                        //shape.ScaleHeight(1.0F, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoScaleFrom.msoScaleFromTopLeft);
                        //图片固定大小和位置 不随单元格变化而变化
                        shape.Placement    = Microsoft.Office.Interop.Excel.XlPlacement.xlFreeFloating;
                        shape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                        shape.Line.ForeColor.ObjectThemeColor = Microsoft.Office.Core.MsoThemeColorIndex.msoThemeColorText1;
                        shape.Line.ForeColor.TintAndShade     = 0;
                        shape.Line.Transparency = 0;
                        shape.Line.Style        = Microsoft.Office.Core.MsoLineStyle.msoLineSingle;
                        //加入到控制集合中用于设置视图变化导致长宽不一致问题
                        listShapes.Add(shape);

                        //添加点检部位和具体位置
                        shape = worksheet.Shapes.AddTextbox(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, px, Convert.ToSingle((py + ImageHeight).ToString("0.00")), ImageWidth, TitleHeight + TitleHeight);
                        //图片固定大小和位置 不随单元格变化而变化
                        shape.Placement = Microsoft.Office.Interop.Excel.XlPlacement.xlFreeFloating;
                        //文字居中显示
                        shape.Width = ImageWidth;
                        shape.TextFrame2.TextRange.ParagraphFormat.Alignment = Microsoft.Office.Core.MsoParagraphAlignment.msoAlignLeft;
                        shape.TextFrame2.TextRange.Font.Bold = Microsoft.Office.Core.MsoTriState.msoTrue;
                        shape.TextFrame2.TextRange.Font.Size = 8;
                        if (detailList[i].question_level == PatrolEntity.QuestionLevel_Emergency)
                        {
                            //点检状态为《需修理/更换》或者问题程度为紧急字体变红色
                            shape.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = 255;
                        }
                        shape.TextFrame2.VerticalAnchor            = Microsoft.Office.Core.MsoVerticalAnchor.msoAnchorMiddle;
                        shape.TextFrame2.TextRange.Characters.Text = detailList[i].location_code_name + "-" + detailList[i].spot_code_name + Environment.NewLine + detailList[i].status_name + ":" + detailList[i].question_level_name;
                        shape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                        shape.Line.ForeColor.ObjectThemeColor = Microsoft.Office.Core.MsoThemeColorIndex.msoThemeColorText1;
                        shape.Line.ForeColor.TintAndShade     = 0;
                        shape.Line.Transparency = 0;
                        //加入到控制集合中用于设置视图变化导致长宽不一致问题
                        listShapes.Add(shape);

                        ////添加问题程度和状态
                        //shape = worksheet.Shapes.AddTextbox(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, px, Convert.ToSingle((py + ImageHeight + TitleHeight).ToString("0.00")), ImageWidth, TitleHeight);
                        ////图片固定大小和位置 不随单元格变化而变化
                        //shape.Placement = Microsoft.Office.Interop.Excel.XlPlacement.xlFreeFloating;
                        ////文字居中显示
                        //shape.Width = ImageWidth;
                        //shape.TextFrame2.TextRange.ParagraphFormat.Alignment = Microsoft.Office.Core.MsoParagraphAlignment.msoAlignLeft;
                        //shape.TextFrame2.TextRange.Font.Bold = Microsoft.Office.Core.MsoTriState.msoTrue;
                        //shape.TextFrame2.TextRange.Font.Size = 8;
                        //if (detailList[i].question_level == PatrolEntity.QuestionLevel_Emergency)
                        //{
                        //    //点检状态为《需修理/更换》或者问题程度为紧急字体变红色
                        //    shape.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = 255;
                        //}
                        //shape.TextFrame2.VerticalAnchor = Microsoft.Office.Core.MsoVerticalAnchor.msoAnchorMiddle;
                        //shape.TextFrame2.TextRange.Characters.Text = detailList[i].status_name +":" + detailList[i].question_level_name;
                        //shape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                        //shape.Line.ForeColor.ObjectThemeColor = Microsoft.Office.Core.MsoThemeColorIndex.msoThemeColorText1;
                        //shape.Line.ForeColor.TintAndShade = 0;
                        //shape.Line.Transparency = 0;
                        ////加入到控制集合中用于设置视图变化导致长宽不一致问题
                        //listShapes.Add(shape);

                        //添加备注文字
                        shape = worksheet.Shapes.AddTextbox(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, px, Convert.ToSingle((py + ImageHeight + TitleHeight + TitleHeight).ToString("0.00")), ImageWidth, RemarksHeight);
                        //图片固定大小和位置 不随单元格变化而变化
                        shape.Placement = Microsoft.Office.Interop.Excel.XlPlacement.xlFreeFloating;
                        //文字居左显示
                        shape.Width = ImageWidth;
                        shape.TextFrame2.TextRange.ParagraphFormat.Alignment = Microsoft.Office.Core.MsoParagraphAlignment.msoAlignLeft;
                        //shape.TextFrame2.TextRange.ParagraphFormat.BaselineAlignment = Microsoft.Office.Core.MsoBaselineAlignment.msoBaselineAlignTop;
                        shape.TextFrame2.TextRange.Font.Bold = Microsoft.Office.Core.MsoTriState.msoTrue;
                        shape.TextFrame2.TextRange.Font.Size = 8;
                        //shape.TextFrame2.MarginLeft = 0;
                        //shape.TextFrame2.MarginRight = 0;
                        shape.TextFrame2.MarginBottom              = 0;
                        shape.TextFrame2.MarginTop                 = 0;
                        shape.TextFrame2.VerticalAnchor            = Microsoft.Office.Core.MsoVerticalAnchor.msoAnchorTop;
                        shape.TextFrame2.TextRange.Characters.Text = detailList[i].remarks;
                        shape.Line.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
                        shape.Line.ForeColor.ObjectThemeColor = Microsoft.Office.Core.MsoThemeColorIndex.msoThemeColorText1;
                        shape.Line.ForeColor.TintAndShade     = 0;
                        shape.Line.Transparency = 0;
                        //加入到控制集合中用于设置视图变化导致长宽不一致问题
                        listShapes.Add(shape);
                        //索引同步更新
                        if (i >= detailList.Count - 1 || j == ImageColumnsPerPage * ImageRowsPerPage - 1)
                        {
                            //到记录最后一条,退出 i值减一
                            break;
                        }
                        else
                        {
                            i++;
                        }
                    }
                    //重新定位到下一页行位置
                    //获取开始行所在位置 总行数包含当前行所以要减一
                    StartRowIndex += RowsCount;
                    range          = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[StartRowIndex, StartColumnIndex];
                    //设置分页符从第二个开始设置 第一个不用设置
                    worksheet.HPageBreaks.Add(range);
                    listPages.Add(range);
                    //自增1
                    pageIndex++;
                }
                #endregion

                //打印设置 设置页眉显示图片 已放弃
                //worksheet.PageSetup.LeftHeaderPicture.Filename = @"C:\Users\liuchengyun.DOMAIN\Desktop\header.bmp";
                //worksheet.PageSetup.CenterHeaderPicture.Filename = @"C:\Users\liuchengyun.DOMAIN\Desktop\header.bmp";
                //worksheet.PageSetup.RightHeaderPicture.Filename = @"C:\Users\liuchengyun.DOMAIN\Desktop\header.bmp";
                //worksheet.PageSetup.LeftHeader = "&G";
                //worksheet.PageSetup.CenterHeader = "&G";
                //worksheet.PageSetup.RightHeader = "&G";
                ////设置页脚
                worksheet.PageSetup.LeftFooter   = "";
                worksheet.PageSetup.CenterFooter = "&\"Arial,加粗\"&14©" + header.company_name + "版权所有";
                worksheet.PageSetup.RightFooter  = "第 &P 页,共 &N 页";
                //worksheet.PageSetup.LeftMargin = xlApp.Application.InchesToPoints(0);
                //worksheet.PageSetup.RightMargin = xlApp.Application.InchesToPoints(0);
                //worksheet.PageSetup.TopMargin = xlApp.Application.InchesToPoints(0);
                //worksheet.PageSetup.BottomMargin = xlApp.Application.InchesToPoints(0);
                //worksheet.PageSetup.HeaderMargin = xlApp.Application.InchesToPoints(0);
                //worksheet.PageSetup.FooterMargin = xlApp.Application.InchesToPoints(0);
                worksheet.PageSetup.PrintArea = "";//"$A$1:$U$" + StartRowIndex;//重设打印区域
                //worksheet.PageSetup.PrintQuality = 600;
                //worksheet.PageSetup.CenterHorizontally = true;
                //worksheet.PageSetup.CenterVertically = true;

                //worksheet.PageSetup.PaperSize = Microsoft.Office.Interop.Excel.XlPaperSize.xlPaperA4;
                //double pp = xlApp.Application.CentimetersToPoints(21);

                //如果没有点检明细那么不要设置只有一页
                //动态设置分页符
                try
                {
                    if (source.patrol_detail_list.Count > 0)
                    {
                        xlApp.ActiveWindow.View = Microsoft.Office.Interop.Excel.XlWindowView.xlPageBreakPreview;
                        //分页符设置
                        for (int i = 1; i <= listPages.Count; i++)
                        {
                            if (i <= worksheet.HPageBreaks.Count && listPages.Count >= worksheet.HPageBreaks.Count)
                            {
                                worksheet.HPageBreaks.Item[i].Location = listPages[i - 1];
                            }
                        }
                    }
                    xlApp.ActiveWindow.View = Microsoft.Office.Interop.Excel.XlWindowView.xlPageLayoutView;
                    for (int j = 0; j < listDecode.Count; j++)
                    {
                        //外观图片备注宽度控制
                        listShapes[j].Width = decodeWidth;
                    }
                    //图片长宽设置
                    for (int i = 0; i < listShapes.Count; i = i + 3)
                    {
                        //图片保证正方形
                        listShapes[i].Width  = ImageWidth;
                        listShapes[i].Height = ImageWidth;
                        //文本框保持宽度和图片一致高度不动
                        listShapes[i + 1].Width = ImageWidth;
                        //listShapes[i+1].Height = ImageWidth;
                        listShapes[i + 2].Width = ImageWidth;
                        //listShapes[i+2].Height = ImageWidth;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("分页错误:" + e.Message);
                    MyLog.Loger.Error("设置分页符错误:" + e.Message);
                }
                //保存文件
                xlApp.ActiveWindow.View = Microsoft.Office.Interop.Excel.XlWindowView.xlPageBreakPreview;
                //xlApp.Visible = true;
                workbook.Save();
                workbook.Saved = true;

                //所有处理都完成
                //转换成pdf文件保存
                worksheet.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF,
                                              strpdf,
                                              Microsoft.Office.Interop.Excel.XlFixedFormatQuality.xlQualityStandard);
                //worksheet.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF,
                //    strpdf,
                //    Microsoft.Office.Interop.Excel.XlFixedFormatQuality.xlQualityStandard,
                //    true,
                //    true,
                //    Type.Missing,
                //    Type.Missing,
                //    false,
                //    Type.Missing
                //    );
                success = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine("导出错误:" + ex.Message);
                MyLog.Loger.Error("导出Excel错误:" + ex.Message);
            }
            finally
            {
                try
                {
                    //if (range != null)
                    //{
                    //    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(range);
                    //    Console.WriteLine("Range关闭");
                    //    range = null;
                    //}
                    //if (worksheet != null)
                    //{
                    //    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(worksheet);
                    //    Console.WriteLine("Sheet关闭");
                    //    worksheet = null;
                    //}
                    //if (workbook != null)
                    //{
                    //    workbook.Close(false);
                    //    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workbook);
                    //    Console.WriteLine("workbook关闭");
                    //    workbook = null;
                    //}
                    //if (workbooks != null)
                    //{
                    //    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workbooks);
                    //    Console.WriteLine("workbooks关闭");
                    //    workbooks = null;
                    //}
                }
                catch (Exception exc)
                {
                    Console.WriteLine("Excel关闭错误:" + exc.Message);
                    MyLog.Loger.Error("Excel关闭错误:" + exc.Message);
                    success = false;
                }
                finally {
                    if (xlApp != null)
                    {
                        //关闭Excel进程
                        KillSpecialExcel(xlApp, processId);
                        xlApp = null;
                        Console.WriteLine("Excel结束所有");
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                    }
                }
            }
            return(success);
        }
示例#2
0
        internal static void exportarDataTableToExcel(DataTable tabla, string encabezado)
        {
            try
            {
                int columnas = tabla.Columns.Count;
                if (tabla == null)
                {
                    MessageBox.Show("No se encontró información en la tabla para exportación. Contacta a Aseguramiento de calidad.");
                    return;
                }


                ClassUtilidades.CopyDataTableToClipboard(tabla, true);
                //Creamos una nueva aplicación de excel.
                Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

                //Abrimos la plantilla de reportes y creamos un nuevo workbook para mostrar ahí el reporte.
                Microsoft.Office.Interop.Excel.Workbook xlWorkBook = xlApp.Workbooks.Add();
                //Obtenemos todas las hojas de la plantilla
                Microsoft.Office.Interop.Excel.Sheets sheets = xlWorkBook.Worksheets;

                //Obtenemos la primera hoja de la plantilla
                Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet = xlApp.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;



                int inicio_y_tabla = 4;
                int inicio_x_tabla = 2;

                //Colocamos la fecha de eleboración del reporte.
                xlWorkSheet.Cells[1, inicio_x_tabla + columnas - 1] = "'" + DateTime.Now.ToString("dd/MM/yyyy");
                xlWorkSheet.Cells[1, inicio_x_tabla + columnas - 1].HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignRight;

                //Combinamos la celda del encabezado.
                xlWorkSheet.Range[xlWorkSheet.Cells[2, inicio_x_tabla], xlWorkSheet.Cells[2, columnas + inicio_x_tabla - 1]].Merge();
                xlWorkSheet.Range[xlWorkSheet.Cells[2, inicio_x_tabla], xlWorkSheet.Cells[2, columnas + inicio_x_tabla - 1]].Font.size           = 15;
                xlWorkSheet.Range[xlWorkSheet.Cells[2, inicio_x_tabla], xlWorkSheet.Cells[2, columnas + inicio_x_tabla - 1]].Font.bold           = true;
                xlWorkSheet.Range[xlWorkSheet.Cells[2, inicio_x_tabla], xlWorkSheet.Cells[2, columnas + inicio_x_tabla - 1]].HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
                xlWorkSheet.Cells[2, inicio_x_tabla] = encabezado;

                //Pegamos nuestra tabla para la generación del reporte.
                Microsoft.Office.Interop.Excel.Range CR = xlWorkSheet.Cells[inicio_y_tabla, inicio_x_tabla] as Microsoft.Office.Interop.Excel.Range;
                CR.Select();
                xlWorkSheet.Paste();

                //Colocamos los bordes de las celdas
                xlWorkSheet.Range[xlWorkSheet.Cells[inicio_y_tabla, inicio_x_tabla], xlWorkSheet.Cells[tabla.Rows.Count + inicio_y_tabla, columnas + inicio_x_tabla - 1]].borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;
                xlWorkSheet.Range[xlWorkSheet.Cells[inicio_y_tabla, inicio_x_tabla], xlWorkSheet.Cells[tabla.Rows.Count + inicio_y_tabla, columnas + inicio_x_tabla - 1]].borders.Weight    = 2d;

                //Se ponen todas las columnas del mismo ancho.
                xlWorkSheet.Range[xlWorkSheet.Cells[inicio_y_tabla, 1], xlWorkSheet.Cells[tabla.Rows.Count + inicio_y_tabla, columnas + inicio_x_tabla]].ColumnWidth = 25;

                //Coloreamos los encabezados de las celdas.
                xlWorkSheet.Range[xlWorkSheet.Cells[inicio_y_tabla, inicio_x_tabla], xlWorkSheet.Cells[inicio_y_tabla, columnas + inicio_x_tabla - 1]].Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Blue);
                xlWorkSheet.Range[xlWorkSheet.Cells[inicio_y_tabla, inicio_x_tabla], xlWorkSheet.Cells[inicio_y_tabla, columnas + inicio_x_tabla - 1]].Font.Color     = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.White);


                string letra = obtenerLetraDeRango(columnas + inicio_x_tabla);
                //Establecemos los márgenes para la impresión y hacemos autoFit


                xlWorkSheet.PageSetup.PrintArea = "";
                xlWorkSheet.PageSetup.PrintArea = string.Format("A1:{0}{1}", letra, tabla.Rows.Count + inicio_y_tabla);
                Microsoft.Office.Interop.Excel.Range aRange = xlWorkSheet.Range[xlWorkSheet.Cells[1, 1], xlWorkSheet.Cells[tabla.Rows.Count + inicio_y_tabla, columnas + inicio_x_tabla]];
                aRange.Rows.AutoFit();

                string rutaPDF = System.Windows.Forms.Application.StartupPath + "\\ultimoReporte.pdf";
                //MessageBox.Show("Guardado en " + rutaPDF);
                xlWorkSheet.ExportAsFixedFormat(
                    Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF,
                    rutaPDF,
                    Microsoft.Office.Interop.Excel.XlFixedFormatQuality.xlQualityStandard,
                    true,
                    false,
                    Type.Missing,
                    Type.Missing,
                    false);



                xlApp.WindowState   = Microsoft.Office.Interop.Excel.XlWindowState.xlMaximized;
                xlApp.Visible       = true;
                xlApp.DisplayAlerts = true;
                //xlWorkBook.WindowDeactivate += cerrarExcel;
            }
            catch (Exception e)
            {
                ClassUtilidades.mostrarMensajeValidacion(e.Message.ToString());
            }
        }