• C#导出数据至excel模板


    开源分享
    最近一个客户要做一个将数据直接输出到指定格式的Excel模板中,略施小计,搞定

    其中包含了对Excel的增行和删行,打印预览,表头,表体,表尾的控制

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Data.SqlClient;
    using System.Reflection;
    using System.IO;
    using System.Windows.Forms;
    
    namespace UFIDA.U8.UAP.QW.Common
    {
        /// <summary>
        /// Excel操作管理
        /// </summary>
        public class ExcelHandler
        {
            
           #region 按模板导出
            /// <summary>
            /// 导出至模板
            /// </summary>
            /// <param name="type">类型{市场费:0,代理费:1}</param>
            /// <param name="dt">数据源</param>
            /// <returns>失败信息errorMsg</returns>
            public string ExportModel(int type, DataTable dt)
            {
                //选择保存路径
                FolderBrowserDialog fbd = new FolderBrowserDialog();
                if (fbd.ShowDialog() != DialogResult.OK)
                    return "";
                string errorMsg = string.Empty;
                string fileName = type == 0 ? "代理费打印模板" : "市场费打印模板";
                string path = Path.GetFullPath(@"Temp" + fileName + ".xlsx");
                string savaPath = fbd.SelectedPath;
                savaPath=savaPath.EndsWith("\")?savaPath:savaPath+"\";
                savaPath += fileName + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
                //需要添加 Microsoft.Office.Interop.Excel引用 
                Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
                try
                {
                    app.Visible = false;
                    app.UserControl = true;
                    Microsoft.Office.Interop.Excel.Workbooks workbooks = app.Workbooks;
                    Microsoft.Office.Interop.Excel._Workbook workbook = workbooks.Add(path); //加载模板
                    Microsoft.Office.Interop.Excel.Sheets sheets = workbook.Sheets;
                    Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel._Worksheet)sheets.get_Item(1); //第一个工作薄。
                    if (worksheet == null)
                    {
                        errorMsg = "工作薄中没有工作表";
                        return errorMsg;
                    }
                    int rowIndex = 7;
                    //写入数据,Excel索引从1开始。
                    //foreach (DataRow row in dt.Rows)
                    //{
                    if (rowIndex ==7)
                    {
                        #region head
                        worksheet.Cells[2, 2] = "客户编码1";//row["产品名称"].ToStr();
                        worksheet.Cells[3, 2] = "客户名称1";//row["产品名称"].ToStr();
    
                        #endregion
    
                        #region bottom
    
                        #endregion
                    }
    
                    #region body
                    worksheet.Cells[rowIndex, 1] = "产品名称1";//row["产品名称"].ToStr();
                    worksheet.Cells[rowIndex, 2] = "规格型号1";//row["规格型号"].ToStr();
                    worksheet.Cells[rowIndex, 3] = 1001.0000;//row["结算数量"].ToStr().ToDouble();
                    worksheet.Cells[rowIndex, 4] = 1002.0000;//row["销售单价"].ToStr().ToDouble();
                    worksheet.Cells[rowIndex, 5] = 1003.0000;//row["销售金额"].ToStr().ToDouble();
                    worksheet.Cells[rowIndex, 6] = 1004.0000;//row["结算单价"].ToStr().ToDouble();
                    worksheet.Cells[rowIndex, 7] = 1005.0000;//row["差价"].ToStr().ToDouble();
                    worksheet.Cells[rowIndex, 8] = 1006.0000;//row["应付费用"].ToStr().ToDouble();
                    #endregion
    
                    rowIndex++;
                    InsertRows(worksheet, rowIndex);
    
                    //}
    
                    //调整Excel的样式。
                    //Microsoft.Office.Interop.Excel.Range rg = worksheet.Cells.get_Range("A3", worksheet.Cells[dt.Rows.Count + 2, 8]);
                    //rg.Borders.LineStyle = 1; //单元格加边框。
                    worksheet.Columns.AutoFit(); //自动调整列宽。
                    //Missing 在System.Reflection命名空间下。
                    workbook.SaveAs(savaPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
                    //workbook.PrintPreview(true);//打印预览,前提是app.Visible = true,否则看不到;
                }
                catch (Exception ex)
                {
                    errorMsg += ex.Message;
                }
                finally
                {
                    //最后一定要退出
                    app.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                    GC.Collect();
                }
                return errorMsg;
            }
            /// <summary>
            /// 在工作表中插入行,并调整其他行以留出空间   
            /// </summary>
            /// <param name="sheet">工作簿</param>
            /// <param name="rowIndex">行索引</param>
            private void InsertRows(Microsoft.Office.Interop.Excel._Worksheet sheet, int rowIndex)
            {
                Microsoft.Office.Interop.Excel.Range range = (Microsoft.Office.Interop.Excel.Range)sheet.Rows[rowIndex, missing];
                //object   Range.Insert(object   shift,   object   copyorigin);     
                //shift:   Variant类型,可选。指定单元格的调整方式。可以为下列   XlInsertShiftDirection   常量之一:   
                //xlShiftToRight   或   xlShiftDown。如果省略该参数,Microsoft   Excel   将根据区域形状确定调整方式。   
                range.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown, missing);
            }
    
            /// <summary>
            /// 在工作表中删除行   
            /// </summary>
            /// <param name="sheet">工作簿</param>
            /// <param name="rowIndex">行索引</param>
            private void DeleteRows(Microsoft.Office.Interop.Excel.Worksheet sheet, int rowIndex)
            {
                Microsoft.Office.Interop.Excel.Range range = (Microsoft.Office.Interop.Excel.Range)sheet.Rows[rowIndex, missing];
                range.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftUp);
            }
    
            #endregion
        }
    }
  • 相关阅读:
    EasyUI笔记(三)Window窗口
    EasyUI笔记(二)Layout布局
    从零构建Flink SQL计算平台
    从零构建Flink SQL计算平台
    Hystrix压测
    Java对象属性复制备忘
    Java垃圾回收手册翻译
    一次虚拟机升级和参数调整记录
    获取不同虚拟机参数的终极方法
    Dataset数据的XML持久化处理
  • 原文地址:https://www.cnblogs.com/bingle/p/3716128.html
Copyright © 2020-2023  润新知