亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

基于微軟示例源碼的excel幫助類實現,能夠規避所有的基于oledb模式的缺陷

2024-07-21 02:45:02
字體:
來源:轉載
供稿:網友
using System;
using System.Data;
using System.Collections;
using System.IO;
using System.Web;
using System.Text;
using Excel;
using System.Data.OleDb;
namespace Sharpnessdotnet.Sample
{


        #region "worksheet-related functions"

        /// <summary>
        /// Escapes special characters in a name and truncates it so that it
        /// could be used as a worksheet name in Excel. The name is truncated to 31
        /// characters; the characters ':', '/', '/', '?', '*', '[' and ']' are replaced
        /// with '_'.
        /// </summary>
        /// <param name="name">The original name.</param>
        /// <returns>The escaped name.</returns>
        public static string CreateValidWorksheetName(string name)
        {
            // Worksheet name cannot be longer than 31 characters.
            System.Text.StringBuilder escapedString;

            if (name.Length <= 31)
            {
                escapedString = new System.Text.StringBuilder(name);
            }
            else
            {
                escapedString = new System.Text.StringBuilder(name, 0, 31, 31);
            }

            for (int i = 0; i < escapedString.Length; i++)
            {
                if (escapedString[i] == ':' ||
                    escapedString[i] == '//' ||
                    escapedString[i] == '/' ||
                    escapedString[i] == '?' ||
                    escapedString[i] == '*' ||
                    escapedString[i] == '[' ||
                    escapedString[i] == ']')
                {
                    escapedString[i] = '_';
                }
            }

            return escapedString.ToString();
        }

        /// <summary>
        /// Returns the worksheet with the given name.
        /// </summary>
        /// <param name="workbook">The workbook containing the worksheet.</param>
        /// <param name="name">The name of the desired worksheet.</param>
        /// <returns>The worksheet from the workbook with the given name.</returns>
        public static Excel.Worksheet GetWorksheet(Excel.Workbook workbook, string name)
        {
            return workbook.Worksheets[name] as Excel.Worksheet;
        }

        /// <summary>
        /// Returns the worksheet at the given index.
        /// </summary>
        /// <param name="workbook">The workbook containing the worksheet.</param>
        /// <param name="index">The index of the desired worksheet.</param>
        /// <returns>The worksheet from the workbook with the given name.</returns>
        static internal Excel.Worksheet GetWorksheet(Excel.Workbook workbook, int index)
        {
            return workbook.Worksheets[index] as Excel.Worksheet;
        }

        /// <summary>
        /// Returns the active worksheet from the workbook.
        /// </summary>
        /// <param name="workbook">The workbook containing the worksheet.</param>
        /// <returns>The active worksheet from the given workbook.</returns>
        public static Excel.Worksheet GetActiveSheet(Excel.Workbook workbook)
        {
            return workbook.ActiveSheet as Excel.Worksheet;
        }

        /// <summary>
        /// Returns the worksheet or chart's name.
        /// </summary>
        /// <param name="item">Worksheet or chart.</param>
        /// <returns>The worksheet or chart's name.</returns>
        public static string GetName(object item)
        {
            string itemName;

            Excel.Worksheet sheet = item as Excel.Worksheet;
            if (sheet != null)
            {
                itemName = sheet.Name;
            }
            else
            {
                Excel.Chart chart = item as Excel.Chart;

                if (chart != null)
                {
                    itemName = chart.Name;
                }
                else
                {
                    itemName = null;
                }
            }

            return itemName;
        }

        #endregion
        #region "range-related functions"

        /// <summary>
        /// Returns the union of the ranges.
        /// </summary>
        /// <param name="range1">The first range to union.</param>
        /// <param name="range2">The second range to union.</param>
        /// <param name="ranges">An array of ranges to union.</param>
        /// <returns>Returns a range containing the union of all the ranges passed in.</returns>
        public static Excel.Range Union(Excel.Range range1,
            Excel.Range range2,
            params Excel.Range[] ranges)
        {
            // All the ranges except the first two.
            object[] overflowParameters = new object[28];


            ranges.CopyTo(overflowParameters, 0);

            for (int i = ranges.Length;
                i < overflowParameters.Length;
                i++)
            {
                overflowParameters[i] = Type.Missing;
            }

            return range1.application.Union(
                range1,
                range2,
                overflowParameters[0],
                overflowParameters[1],
                overflowParameters[2],
                overflowParameters[3],
                overflowParameters[4],
                overflowParameters[5],
                overflowParameters[6],
                overflowParameters[7],
                overflowParameters[8],
                overflowParameters[9],
                overflowParameters[10],
                overflowParameters[11],
                overflowParameters[12],
                overflowParameters[13],
                overflowParameters[14],
                overflowParameters[15],
                overflowParameters[16],
                overflowParameters[17],
                overflowParameters[18],
                overflowParameters[19],
                overflowParameters[20],
                overflowParameters[21],
                overflowParameters[22],
                overflowParameters[23],
                overflowParameters[24],
                overflowParameters[25],
                overflowParameters[26],
                overflowParameters[27]
                );
        }


        /// <summary>
        /// Returns the intersection of the ranges.
        /// </summary>
        /// <param name="range1">The first range to intersect.</param>
        /// <param name="range2">The second range to intersect.</param>
        /// <param name="ranges">An array of ranges to intersect.</param>
        /// <returns>Returns a range containing the intersect of all the ranges passed in.</returns>
        public static Excel.Range Intersect(Excel.Range range1,
            Excel.Range range2,
            params Excel.Range[] ranges)
        {
            // All the ranges except the first two.
            object[] overflowParameters = new object[28];


            ranges.CopyTo(overflowParameters, 0);

            for (int i = ranges.Length;
                i < overflowParameters.Length;
                i++)
            {
                overflowParameters[i] = Type.Missing;
            }

            return range1.Application.Intersect(
                range1,
                range2,
                overflowParameters[0],
                overflowParameters[1],
                overflowParameters[2],
                overflowParameters[3],
                overflowParameters[4],
                overflowParameters[5],
                overflowParameters[6],
                overflowParameters[7],
                overflowParameters[8],
                overflowParameters[9],
                overflowParameters[10],
                overflowParameters[11],
                overflowParameters[12],
                overflowParameters[13],
                overflowParameters[14],
                overflowParameters[15],
                overflowParameters[16],
                overflowParameters[17],
                overflowParameters[18],
                overflowParameters[19],
                overflowParameters[20],
                overflowParameters[21],
                overflowParameters[22],
                overflowParameters[23],
                overflowParameters[24],
                overflowParameters[25],
                overflowParameters[26],
                overflowParameters[27]
                );
        }

        /// <summary>
        /// Returns the range with the given name from the workbook.
        /// </summary>
        /// <param name="workbook">The workbook containing the named range.</param>
        /// <param name="name">The name of the desired range.</param>
        /// <returns>The range with the given name from the workbook.</returns>
        public static Excel.Range GetNamedRange(Excel.Workbook workbook, string name)
        {
            Excel.Name nameObject = workbook.Names.Item(
                name,
                Type.Missing,
                Type.Missing);

            return nameObject.RefersToRange;
        }

        /// <summary>
        /// Returns the range with the given name from the given worksheet.
        /// </summary>
        /// <param name="worksheet">The worksheet containing the named range.</param>
        /// <param name="name">The name of the desired range.</param>
        /// <returns>The range with the given name from the given worksheet.</returns>
        public static Excel.Range GetNamedRange(Excel.Worksheet worksheet, string name)
        {
            return worksheet.get_Range(name, Type.Missing);
        }

        /// <summary>
        /// Returns a range with the column at the specified index of the range.
        /// </summary>
        /// <param name="rowRange">The range containing the desired column.</param>
        /// <param name="column">The index of the desired column from the range.</param>
        /// <returns>The range containing the specified column from the given range.</returns>
        public static Excel.Range GetColumnFromRange(Excel.Range rowRange, int column)
        {
            return rowRange.Columns[column, Type.Missing] as Excel.Range;
        }

        /// <summary>
        /// Returns a range with the row at the specified index of the range.
        /// </summary>
        /// <param name="columnRange">The range containing the desired row.</param>
        /// <param name="row">The index of the desired row from the range.</param>
        /// <returns>The range containing the specified row from the given range.</returns>
        public static Excel.Range GetRowFromRange(Excel.Range columnRange, int row)
        {
            return columnRange.Rows[row, Type.Missing] as Excel.Range;
        }

        /// <summary>
        /// Returns a range consisting of the cell at the specified row and column.
        /// </summary>
        /// <param name="range">The range containing the desired cell.</param>
        /// <param name="row">The index of the row containing the desired cell.</param>
        /// <param name="column">The index of the column containing the desired cell.</param>
        /// <returns></returns>
        public static Excel.Range GetCellFromRange(Excel.Range range, int row, int column)
        {
            return range.Cells[row, column] as Excel.Range;
        }

        /// <summary>
        /// Returns the value of the given range as an object.
        /// </summary>
        /// <param name="range">The range from which the value will be obtained.</param>
        /// <param name="address">The local address of the subrange from which to pull the value.</param>
        /// <returns>Returns the value of the cell in the subrange specified by the address.</returns>
        public static Object GetValue(Excel.Range range, string address)
        {
            return range.get_Range(address, Type.Missing).Value2;
        }

        /// <summary>
        /// Returns the value of the given range as a double.
        /// </summary>
        /// <param name="range">The range from which the value will be obtained.</param>
        /// <returns>Returns the value of the range as a double.</returns>
        public static double GetValueAsDouble(Excel.Range range)
        {
            if (range.Value2 is double)
            {
                return (double)range.Value2;
            }

            return double.NaN;
        }

        /// <summary>
        /// Returns the value of the cell at the specified indexes as a double.
        /// </summary>
        /// <param name="sheet">The worksheet containing the desired cell.</param>
        /// <param name="row">The row of the worksheet containing the cell.</param>
        /// <param name="column">The column of the worksheet containing the cell.</param>
        /// <returns>Returns the value of the cell at the given indexes as a double.</returns>
        public static double GetValueAsDouble(Excel.Worksheet sheet, int row, int column)
        {
            Excel.Range subRange = ((Excel.Range)sheet.Cells[row, column]);

            return GetValueAsDouble(subRange);
        }

        /// <summary>
        /// Returns the value of the cell at the specified indexes as a double.
        /// </summary>
        /// <param name="range">The range containing the desired cell.</param>
        /// <param name="row">The row of the range containing the cell.</param>
        /// <param name="column">The column of the range containing the cell.</param>
        /// <returns>Returns the value of the cell at the specified indexes as a double.</returns>
        public static double GetValueAsDouble(Excel.Range range, int row, int column)
        {
            Excel.Range subRange = ((Excel.Range)range.Cells[row, column]);

            return GetValueAsDouble(subRange);
        }

        /// <summary>
        /// Returns the value of the given range as a string.
        /// </summary>
        /// <param name="range">The range from which the value will be obtained.</param>
        /// <returns>Returns the value of the given range as a string.</returns>
        public static string GetValueAsString(Excel.Range range)
        {
            if (!(range.Value2 == null))
            {
                return range.Value2.ToString();
            }

            return null;
        }

        /// <summary>
        /// Returns the value of the cell at the specified indexes as a string.
        /// </summary>
        /// <param name="range">The range containing the desired cell.</param>
        /// <param name="row">The row of the range containing the cell.</param>
        /// <param name="column">The column of the range containing the cell.</param>
        /// <returns>Returns the value of the cell at the specified indexes as a string.</returns>
        public static string GetValueAsString(Excel.Range range, int row, int column)
        {
            Excel.Range subRange = ((Excel.Range)range.Cells[row, column]);

            return GetValueAsString(subRange);
        }

        /// <summary>
        /// Returns the value of the cell at the specified indexes as a string.
        /// </summary>
        /// <param name="sheet">The worksheet containing the desired cell.</param>
        /// <param name="row">The row of the worksheet containing the cell.</param>
        /// <param name="column">The column of the worksheet containing the cell.</param>
        /// <returns>Returns the value of the cell at the given indexes as a string.</returns>
        public static string GetValueAsString(Excel.Worksheet sheet, int row, int column)
        {
            Excel.Range subRange = ((Excel.Range)sheet.Cells[row, column]);

            return GetValueAsString(subRange);
        }

        /// <summary>
        /// Sets the formula in the English (United States) locale. This enables code that executes
        /// correctly in different locales. For example, formula "=SUM (1.5, 3.0)"
        /// is correct in English (United States), but would fail in French (France),
        /// which would expect "=SOMME(1,5;3,0)". We cannot automatically translate formulas;
        /// instead, we are using reflection to specify the En-US locale.
        /// </summary>
        /// <param name="range">The range containing the desired cell.</param>
        /// <param name="formula">The formula in English (United States) locale to assign to that cell.</param>
        //        public static void SetFormula(Excel.Range range, string formula)
        //        {
        //
        //            // Sets culture to en-US
        //            typeof(Excel.Range).InvokeMember("Formula",
        //                System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.SetPRoperty,
        //                null,
        //                range,
        //                new object[] { formula },
        //                System.Globalization.CultureInfo.GetCultureInfo(1033));
        //        }

        #endregion
        #region "shapes-related functions"
        /// <summary>
        /// Gets the shape with the given name from the active worksheet.
        /// </summary>
        /// <param name="workbook">The workbook containing the shape.</param>
        /// <param name="name">The name of the shape.</param>
        /// <returns>Returns the shape with the given name from the active worksheet.</returns>
        public static Excel.Shape GetShape(Excel.Workbook workbook, string name)
        {
            return GetShape(GetActiveSheet(workbook), name);
        }

        /// <summary>
        /// Gets the shape at the given index from the active worksheet.
        /// </summary>
        /// <param name="workbook">The workbook containing the shape.</param>
        /// <param name="index">The index of the shape.</param>
        /// <returns>Returns the shape at the given index from the active worksheet.</returns>
        public static Excel.Shape GetShape(Excel.Workbook workbook, int index)
        {
            return GetShape(GetActiveSheet(workbook), index);
        }

        /// <summary>
        /// Gets the shape with the given name from the given worksheet.
        /// </summary>
        /// <param name="worksheet">The worksheet containing the shape.</param>
        /// <param name="name">The name of the shape.</param>
        /// <returns>Returns the shape with the given name from the given worksheet.</returns>
        public static Excel.Shape GetShape(Excel.Worksheet worksheet, string name)
        {
            return worksheet.Shapes._Default(name);
        }

        /// <summary>
        /// Gets the shape at the given index from the given worksheet.
        /// </summary>
        /// <param name="worksheet">The worksheet containing the shape.</param>
        /// <param name="index">The index of the shape.</param>
        /// <returns>Returns the shape at the given index from the given worksheet.</returns>
        public static Excel.Shape GetShape(Excel.Worksheet worksheet, int index)
        {
            return worksheet.Shapes._Default(index);
        }
        #endregion
        #region "date-related functions"
        // Dates in Excel are based on January 1, 1900.
        // There are two reasons for using December 30th, 1899.
        // One reason is that 29/2/1900 is valid in excel (in
        // reality, it is not valid date: 1900 is not a leap year);
        // the other is that 0 in Excel corresponds to January 0.
        public readonly static DateTime timeOrigin =
            new DateTime(1899, 12, 30, 0, 0, 0, 0);

        /// <summary>
        /// Returns the date as the decimal equivalent for Excel.
        /// </summary>
        /// <param name="dateValue">The date to convert.</param>
        /// <returns>A decimal representation of the date for Excel.</returns>
        public static double GetSerialDate(DateTime dateValue)
        {
            TimeSpan since1900 = dateValue - timeOrigin;

            return since1900.Days;
        }

        /// <summary>
        /// Returns a DateTime from the decimal representation of a date in Excel.
        /// </summary>
        /// <param name="serial">The decimal date value from Excel.</param>
        /// <returns>A DateTime equivalent of the decimal representation of a date in Excel.</returns>
        public static DateTime GetDateTime(double serial)
        {
            TimeSpan since1900 = new TimeSpan((int)serial, 0, 0, 0);

            return timeOrigin.Add(since1900);
        }

        #endregion
        #region "outer interface"
        /// <summary>
        /// 安全加載一個Excel文件對象
        /// </summary>
        /// <returns></returns>
        public static Excel.Workbook SafeOpenExcel()
        {

            Excel.ApplicationClass curAppClass = new Excel.ApplicationClass();
            //curAppClass.FileSearch.FileType = MsoFileType.msoFileTypeExcelWorkbooks;
            if (curAppClass.FindFile())
            {
                return curAppClass.ActiveWorkbook;
            }
            else
            {
                return null;
            }

        }

        /// <summary>
        /// 安全加載一個Excel文件對象
        /// </summary>
        /// <param name="sFile">文件路徑(絕對路徑)</param>
        /// <returns></returns>
        public static Excel.Workbook SafeOpenExcel(string sFilePath)
        {
            Excel.ApplicationClass curAppClass = new Excel.ApplicationClass();
            if (System.IO.File.Exists(sFilePath))
            {
                object MissingValue = Type.Missing;
                return curAppClass.Workbooks.Open(sFilePath, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue, MissingValue);
            }
            else
            {
                return null;
            }
        }
        /// <summary>
        /// 安全關閉已打開的Excel對象
        /// </summary>
        /// <param name="openedExcelObject"></param>
        /// <param name="bSaveChanges"></param>
        public static void SafeCloseExcel(Excel.Workbook openedExcelObject, bool bSaveChanges)
        {
            openedExcelObject.Close(bSaveChanges, Type.Missing, Type.Missing);
        }
        #endregion

        public static System.Data.DataTable GetDataFromSheet(Excel.Worksheet sheet)
        {
            System.Data.DataTable dtCreate = new System.Data.DataTable();
            ///原始數據    
            dtCreate.TableName = "導入_" + sheet.Name;
            DataColumn column = null;
            /// 原始數據列集合定義
            for (int c = 1; c <= sheet.UsedRange.Columns.Count; c++)
            {
                column = new DataColumn();
                column.DataType = typeof(object);
                column.ColumnName = "列_" + c.ToString();
                column.Caption = "列_" + c.ToString();
                column.AutoIncrement = false;
                column.ReadOnly = false;
                column.Unique = false;
                dtCreate.Columns.Add(column);
            }
            ///原始數據數據區封裝          
            for (int r = 1; r <= sheet.UsedRange.Rows.Count; r++)
            {
                DataRow row = dtCreate.NewRow();
                dtCreate.Rows.Add(row);
                for (int c = 1; c <= dtCreate.Columns.Count; c++)
                {
                    ///數據值賦予
                    Excel.Range cell = sheet.Cells[r, c] as Excel.Range;
                    row[dtCreate.Columns[c - 1]] = cell.Text;
                }
            }
            return dtCreate;
        }
        public static System.Data.DataTable GetDataFromSheet1(string sFilePath)
        {
            System.Data.DataTable data = null;
            Excel.Workbook wbook = SafeOpenExcel(sFilePath);
            data = GetDataFromSheet((Excel.Worksheet)wbook.Sheets[1]);
            SafeCloseExcel(wbook, false);
            return data;
        }
}
}
ps:需增加對Interop.Excel.dll的引用.



本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/sharpnessdotnet/archive/2009/12/17/5023456.aspx
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
这里只有精品久久| 97视频网站入口| 亚洲高清久久久久久| 最新国产精品拍自在线播放| 亚洲视频在线看| 欧美成人精品h版在线观看| 久久综合久久八八| 亚洲精品丝袜日韩| 久久中文精品视频| 精品综合久久久久久97| 欧美性xxxx极品hd欧美风情| 69国产精品成人在线播放| 国产精品视频一区二区高潮| 午夜精品久久久久久久99热| 国产成人久久久精品一区| 精品亚洲永久免费精品| 91av视频在线观看| 欧美大片第1页| 热久久免费国产视频| 97色在线播放视频| 欧美野外猛男的大粗鳮| 日本a级片电影一区二区| 亚洲国产91精品在线观看| www.国产精品一二区| 亚洲tv在线观看| 日韩在线视频播放| 日韩**中文字幕毛片| 这里只有视频精品| 日韩av免费看网站| 久久精品国产91精品亚洲| 亚洲国产欧美久久| 热久久美女精品天天吊色| 精品亚洲一区二区三区| 欧美久久精品一级黑人c片| 中文字幕九色91在线| 亚洲乱码一区二区| 深夜精品寂寞黄网站在线观看| 欧美成人免费在线观看| 91国产美女视频| 亚洲情综合五月天| 88国产精品欧美一区二区三区| 国产精品www色诱视频| 美女性感视频久久久| 精品亚洲永久免费精品| 国产精品私拍pans大尺度在线| 91久久久亚洲精品| 精品一区二区三区四区| 精品欧美激情精品一区| 欧美成人黑人xx视频免费观看| 91av视频在线播放| 国产精品爽爽爽| 国产精品九九久久久久久久| 国产欧美一区二区三区久久人妖| 一区二区三区久久精品| 亚洲欧美视频在线| 亚洲精品欧美日韩专区| 在线观看免费高清视频97| 国产精品欧美一区二区三区奶水| 亚洲精品电影在线观看| 欧美丰满片xxx777| 日韩大片免费观看视频播放| 国产精品美女久久| 亚洲美女精品成人在线视频| 亚洲激情国产精品| 亚洲第一av在线| 亚洲欧美国产一区二区三区| 青青草原一区二区| 亚洲精品动漫久久久久| 亚洲国产欧美一区| www日韩中文字幕在线看| 亚洲国模精品一区| 亚洲娇小xxxx欧美娇小| 亚洲精品第一页| 精品动漫一区二区| 日韩视频免费看| 亚洲电影免费观看高清完整版在线| 91久久在线观看| 国产精品人人做人人爽| 岛国av一区二区| 26uuu国产精品视频| 91日韩在线视频| 亚洲人在线视频| 51视频国产精品一区二区| xvideos国产精品| 欧美中文字幕第一页| 日韩av电影中文字幕| 国产有码一区二区| 日韩欧美高清视频| 久久99视频免费| 欧美在线观看视频| 日本一区二区三区在线播放| 日韩国产精品亚洲а∨天堂免| 国外成人免费在线播放| 国产一区二区三区毛片| 久久97精品久久久久久久不卡| 国产成人精品久久二区二区91| 亚洲精品成a人在线观看| 国产自产女人91一区在线观看| 少妇高潮久久久久久潘金莲| 成年人精品视频| 日韩专区在线观看| 欧美性猛交99久久久久99按摩| 国产精品丝袜久久久久久不卡| 亚洲综合在线中文字幕| 国产精品成人国产乱一区| 日韩精品中文字幕视频在线| 欧美日韩在线免费| 欧美成人第一页| 97色在线视频| 亚洲欧洲xxxx| 午夜精品福利电影| 久久久久久国产三级电影| 亚洲自拍偷拍色图| 欧美日韩中文字幕综合视频| 日韩在线中文字| 久久久伊人日本| 成人免费网站在线看| 国产美女精品视频免费观看| 久久久精品电影| 最近中文字幕mv在线一区二区三区四区| 亚洲欧美一区二区三区四区| 欧美一区二区三区……| 日韩**中文字幕毛片| 欧美一级片久久久久久久| 91sa在线看| 亚洲一区美女视频在线观看免费| 色与欲影视天天看综合网| 色综合久久久久久中文网| 国产97在线|亚洲| 欧美大片va欧美在线播放| 永久免费看mv网站入口亚洲| 免费91麻豆精品国产自产在线观看| 中文字幕欧美精品日韩中文字幕| 国产视频在线一区二区| 久久国产精品久久久久| 成人久久一区二区三区| 精品久久久免费| 久久久久亚洲精品国产| 蜜月aⅴ免费一区二区三区| 色多多国产成人永久免费网站| 国产成人久久久精品一区| 国产精品久久久久免费a∨大胸| 欧美成人免费在线视频| 亚洲精品v天堂中文字幕| 欧美成人精品激情在线观看| 久久久久国产精品一区| 亚洲男人天堂网站| 国产午夜精品理论片a级探花| 亚洲图片制服诱惑| 国产91精品在线播放| 国产精品精品久久久| 一区二区三区无码高清视频| 久久这里有精品视频| 久久久噜噜噜久久| 亚洲国产成人一区| 日韩高清免费在线| 国产一区二区欧美日韩| 91视频-88av| 中文字幕无线精品亚洲乱码一区| 欧美成人黑人xx视频免费观看| 久久精品美女视频网站| 欧美精品一区在线播放| 亚洲综合中文字幕在线观看| 成人久久18免费网站图片|