zoukankan      html  css  js  c++  java
  • 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
        }
    }
  • 相关阅读:
    SGU 176.Flow construction (有上下界的最大流)
    POJ 2391.Ombrophobic Bovines (最大流)
    poj 1087.A Plug for UNIX (最大流)
    poj 1273.PIG (最大流)
    POJ 2112.Optimal Milking (最大流)
    SGU 196.Matrix Multiplication
    SGU 195. New Year Bonus Grant
    关于multicycle path
    ppt做gif动图
    codeforces 598A Tricky Sum
  • 原文地址:https://www.cnblogs.com/bingle/p/3716128.html
Copyright © 2011-2022 走看看