信息导到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" }));

        }

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

posted @ 2010-03-30 17:06  天天不在  阅读(746)  评论(1编辑  收藏  举报