• 信息导到Execl上.


    项目里有个小的模块.就是把数据库里的信息输出到Execl上.开始因为这部分只会有一二个文件.没有怎么封装.后来文件多了.

    看到很多处代码都有打开Execl的这种代码.封装一下(现这部分代码全是测试用的.).

    首先是封装打开写入信息到Execl文件的代码.

        public class DataFile
        {
            public string SavePath { get; set; }
            public string SrcPathName { get; set; }
            public string SaveName { get; set; }
    
            public string OnAction(params Action<Microsoft.Office.Interop.Excel.Worksheet>[] actions)
            {
                DirectoryInfo path = new DirectoryInfo(SavePath);
                if (path.GetFiles().Where(p => p.Name == SaveName).Count() > 0)
                    SaveName += DateTime.Now.ToString("yyyymmddHHMMss");
                string SavePathName = "";
                if (SavePath.EndsWith(@"\"))
                    SavePathName = SavePath + SaveName + ".xls";
                else
                    SavePathName = SavePath + @"\" + SaveName + ".xls";
                Microsoft.Office.Interop.Excel.Application myExcel = new Microsoft.Office.Interop.Excel.Application();
                myExcel.Workbooks.Open(SrcPathName, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);           
                Microsoft.Office.Interop.Excel.Workbook wbook = myExcel.Workbooks[1];
                Microsoft.Office.Interop.Excel.Worksheet wsheet = null;
                for (int i = 0; i < actions.Length; i++)
                {
                    wsheet = (Microsoft.Office.Interop.Excel.Worksheet)myExcel.Worksheets.get_Item(i+1);                
                    actions[i](wsheet);
                }
                wbook.SaveAs(SavePathName, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                myExcel.Quit();
                Kill(myExcel);
                myExcel = null;
                GC.Collect();
                return SavePathName;
    
            }
            public void Kill(Microsoft.Office.Interop.Excel.Application excel)
            {
                if (excel == null)
                    return;
                IntPtr t = new IntPtr(excel.Hwnd);   
                int k = 0;
                GetWindowThreadProcessId(t, out k);    
                Process p = Process.GetProcessById(k); 
                p.Kill();      //关闭进程k
            }
            [DllImport("User32.dll", CharSet = CharSet.Auto)]
            public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
             
        }

    这部分代码是帮助把数据集合导入到Execl里面的.在这里说一句.为什么VS2008里的C#还不支持默认参数!!(不知是不是我OUT了.)

        public static class PropertyHelper
        {
            public static List<T> DataTableToList<T>(DataTable table) where T : new()
            {
                PropertyInfo[] ps = typeof(T).GetProperties();
                List<T> ts = new List<T>();
                foreach (DataRow row in table.Rows)
                {
                    T t = new T();// T t = Activator.CreateInstance<T>();
                    foreach (PropertyInfo p in ps)
                    {
                        p.SetValue(t, row[p.Name], null);
                    }
                    ts.Add(t);
                }
                return ts;
            }
            public static DataTable ListToDataTable<T>(this IEnumerable<T> data)
            {
                PropertyInfo[] ps = typeof(T).GetProperties();
                DataTable table = new DataTable();
                foreach (PropertyInfo p in ps)
                {
                    table.Columns.Add(p.Name, p.PropertyType);
                }
                foreach (T t in data)
                {
                    DataRow row = table.NewRow();
                    foreach (PropertyInfo p in ps)
                    {
                        row[p.Name] = p.GetValue(t, null);
                    }
                    table.Rows.Add(row);
                }
                return table;
            }
    
            public static void CompressFile(string sourceFile, string destinationFile, string desName)
            {
                if (File.Exists(sourceFile) == false)
                    throw new FileNotFoundException();
                FileStream reader = null;
                FileStream writer = null;
                MemoryStream ms = null;
                try
                {
                    //文件流
                    reader = File.Open(sourceFile, FileMode.Open);
                    writer = File.Create(destinationFile);
                    //压缩相关的流 
                    ms = new MemoryStream();
                    GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress, true);
                    //往压缩流中写数据 
                    byte[] sourceBuffer = new byte[reader.Length];
                    reader.Read(sourceBuffer, 0, sourceBuffer.Length);
                    zipStream.Write(sourceBuffer, 0, sourceBuffer.Length);
                    //一定要在内存流读取之前关闭压缩流 
                    zipStream.Close();
                    zipStream.Dispose();
    
                    //从内存流中读数据 
                    ms.Position = 0; //注意,不要遗漏此句 
                    byte[] header = new byte[10];
                    ms.Read(header, 0, 10);
                    header[3] = 8;        //表示包含文件名信息
                    byte[] fielContent = new byte[ms.Length - 10];
                    ms.Read(fielContent, 0, fielContent.Length);
    
                    byte[] filename = System.Text.Encoding.Default.GetBytes(desName);
                    writer.Write(header, 0, header.Length);
                    writer.Write(filename, 0, filename.Length);
                    writer.WriteByte(0);
                    writer.Write(fielContent, 0, fielContent.Length);
                }
                catch (ApplicationException ex)
                {
                    new Exception("压缩文件出错!" + ex.Message);
                }
                finally
                {
                    // Make sure we allways close all streams
                    ms.Close();
                    ms.Dispose();
    
                    //关闭并释放文件流 
                    writer.Close();
                    writer.Dispose();
                    reader.Close();
                    reader.Dispose();
                }
            }
            #region "IEnumerable导出EXECL"
            public static void EnumToExel<T>(this IEnumerable<T> data, Microsoft.Office.Interop.Excel.Worksheet wsheet)
            {
                data.EnumToExel<T>(wsheet, 1, 1);
            }
            public static void EnumToExel<T>(this IEnumerable<T> data, Microsoft.Office.Interop.Excel.Worksheet wsheet, int top, int left)
            {
                data.EnumToExel<T>(wsheet, top, left, false);
            }
            public static void EnumToExel<T>(this IEnumerable<T> data, Microsoft.Office.Interop.Excel.Worksheet wsheet, int top, int left, bool IsHaveCoulumn)
            {
                data.EnumToExel<T>(wsheet, top, left, IsHaveCoulumn, null);
            }
            public static void EnumToExel<T>(this IEnumerable<T> data, Microsoft.Office.Interop.Excel.Worksheet wsheet, int top, int left, bool IsHaveCoulumn, string[] removeProperty)
            {
                List<PropertyInfo> ps = typeof(T).GetProperties().ToList();
                if (removeProperty != null)
                {
                    foreach (string pro in removeProperty)
                    {
                        ps.Remove(ps.FirstOrDefault(p => p.Name.ToUpper() == pro.ToUpper()));
                    }
                }
                int nTop = top;
                int nLeft = left;
                if (IsHaveCoulumn)
                {
                    foreach (PropertyInfo info in ps)
                    {
                        wsheet.Cells[nTop, nLeft] = info.Name;
                        nLeft++;
                    }
                    nTop++;
                }
                foreach (T t in data)
                {
                    nLeft = left;
                    foreach (PropertyInfo info in ps)
                    {
                        wsheet.Cells[nTop, nLeft] = info.GetValue(t, null);
                        nLeft++;
                    }
                    nTop++;
                }
            }
            #endregion ""
            #region "DataTable导出EXECL"
            public static void EnumToExel(Microsoft.Office.Interop.Excel.Worksheet wsheet, DataTable data)
            {
                EnumToExel(wsheet, data, 1, 1, false, null);
            }
            public static void EnumToExel(Microsoft.Office.Interop.Excel.Worksheet wsheet, DataTable data, int top, int left)
            {
                EnumToExel(wsheet, data, top, left, false, null);
            }
            public static void EnumToExel(Microsoft.Office.Interop.Excel.Worksheet wsheet, DataTable data, int top, int left, bool IsHaveCoulumn)
            {
                EnumToExel(wsheet, data, top, left, IsHaveCoulumn, null);
            }
            public static void EnumToExel(Microsoft.Office.Interop.Excel.Worksheet wsheet, DataTable data, int top, int left, bool IsHaveCoulumn, string[] removeCoulumn)
            {
                if (removeCoulumn != null)
                {
                    foreach (string pro in removeCoulumn)
                    {
                        int nCount = data.Columns.Count;
                        for (int i = 0; i < nCount; i++)
                        {
                            string coulumn = data.Columns[i].ColumnName.ToUpper();
                            if (coulumn == pro.ToUpper())
                                data.Columns.Remove(data.Columns[i]);
                        }
                    }
                }
                int nTop = top;
                int nLeft = left;
                if (IsHaveCoulumn)
                {
                    foreach (DataColumn info in data.Columns)
                    {
                        wsheet.Cells[nTop, nLeft] = info.ColumnName;
                        nLeft++;
                    }
                    nTop++;
                }
                foreach (DataRow t in data.Rows)
                {
                    nLeft = left;
                    foreach (DataColumn info in data.Columns)
                    {
                        wsheet.Cells[nTop, nLeft] = t[info];
                        nLeft++;
                    }
                    nTop++;
                }
            }
            #endregion
    
            public static void Write<T>(T s)
            {
                System.Reflection.PropertyInfo[] ms = typeof(T).GetProperties();
                foreach (PropertyInfo minfo in ms)
                {
                    if (minfo.GetValue(s, null) != null)
                    {
                        string value = minfo.GetValue(s, null).ToString();
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.Write(minfo.Name);
                        Console.ForegroundColor = ConsoleColor.White;
                        Console.Write(":");
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.Write(value);
                        Console.Write(" ");
                    }
                }
                Console.WriteLine();
            }
        }
    

    下面测试用法.是否正确导入数据.

            public void TestFun()
            {
                DataFile ListBomPart = new DataFile();
                ListBomPart.SaveName = "TestFile";
                ListBomPart.SavePath = Directory.GetCurrentDirectory();
                ListBomPart.SrcPathName = ConfigurationSettings.AppSettings["TestFileName"];
                string resultfilename = ListBomPart.OnAction(
                    p => Db.TableOne.ToList().EnumToExel(p, 2, 1, false, new string[] { "ID" })
                   , t => Db.TableTwo.ToList().EnumToExel(t, 2, 1, false, new string[] { "ID", "Updatedate", "Updatename" }));
    
            }
    

    大家感觉有用的自己改改.有更好建议请提出来.谢谢.

  • 相关阅读:
    BFC
    js异常处理
    vue双向数据绑定的简单实现
    cookie封装,localstage封装
    问题 1476: [蓝桥杯][基础练习VIP]龟兔赛跑预测 (模拟)
    HDU 6205 (模拟) card card card
    HDU 4545 (模拟) 魔法串
    HDU 4521 小明系列问题——小明序列 (线段树 单点更新)
    基础动态规划 讲解
    HDU 1561 The more, The Better (有依赖背包 || 树形DP)
  • 原文地址:https://www.cnblogs.com/zhouxin/p/1700753.html
Copyright © 2020-2023  润新知