zoukankan      html  css  js  c++  java
  • C#语言的Excel文件导入导出

    Microsoft.Office.Tools.Excel 命名空间(引用的Com组件),微软msdn帮助

    http://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.excel(VS.80).aspx

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Data.OleDb;
    using System.Data.Odbc;
    using Excel=Microsoft.Office.Interop.Excel;
    using System.Collections;
    using System.Windows.Forms;

    /**********************
     * 作者:王凌云
     * 日期:2011年3月6日
     * 功能:Excel文件的导入导出等功能
     **********************/
    namespace OfficeHelper
    {
        public class ToExcel
        {
            private Excel.Application _app = null;
            private Excel.Workbook _workbook = null;
            private Excel.Worksheet _worksheet = null;
            private Excel.Range _range = null;
            private bool _visible = true;
            private bool _exportTitle = false;
            private string _title = "";
            private object _missing = System.Reflection.Missing.Value;
            private object _fileName;
            /// <summary>
            /// 导出excel的标题
            /// </summary>
            public string Title
            {
                get { return _title; }
                set { _title = value; }
            }
            /// <summary>
            /// 当前表单
            /// </summary>
            public Excel.Worksheet CurrentWorkSheet
            {
                get { return _worksheet; }
                set { _worksheet = value; }
            }
            /// <summary>
            /// 当前Excel文档
            /// </summary>
            public Excel.Workbook CurrentWorkBook
            {
                get { return _workbook; }
                set { _workbook = value; }
            }
            /// <summary>
            /// 当前Excel应用
            /// </summary>
            public Excel.Application ExcelApp
            {
                get { return _app; }
                set { _app = value; }
            }
            /// <summary>
            /// Excel文档的可见性
            /// </summary>
            public bool ExcelVisible
            {
                get { return _visible; }
                set { _visible = value; }
            }
            /// <summary>
            /// 是否导出标题
            /// </summary>
            public bool ExprotTitle
            {
                get { return _exportTitle; }
                set { _exportTitle = value; }
            }

            /// <summary>
            /// 构造函数,无代码
            /// </summary>
            public ToExcel()
            {
            }
            /// <summary>
            /// 构造函数,初始化Excel应用
            /// </summary>
            /// <param name="visible">Excel文档是否可见</param>
            public ToExcel(bool visible)
            {
                try
                {
                    _app = new Excel.Application();
                    _visible = visible;
                    _app.Visible = _visible;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            /// <summary>
            /// 析构函数
            /// </summary>
            ~ToExcel()
            {
                try
                {
                    if (_app != null && _app.Visible == false)
                    {
                        _app.Quit();
                    }
                }
                catch
                {
                }
            }
            /// <summary>
            /// 初始化app属性
            /// </summary>
            public void InitApp()
            {
                try
                {
                    if (_app == null)
                        _app = new Excel.Application();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            /// <summary>
            /// 初始化wookbook属性
            /// </summary>
            public void InitBook()
            {
                InitApp();
                try
                {
                    if (_workbook == null)
                        _workbook = _app.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
                }
                catch (Exception ex)
                {

                    throw ex;
                }
               
            }
            /// <summary>
            /// 创建Excel文档
            /// </summary>
            public Excel.Workbook CreateBook()
            {
                Excel.Workbook book = null;
                try
                {
                    book = _app.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
                }
                catch (Exception ex)
                {

                    throw ex;
                }
                return book;
            }
            /// <summary>
            /// 创建Excel文档
            /// </summary>
            /// <param name="templete">Excel文档创建模板</param>
            /// <returns></returns>
            public Excel.Workbook CreateBook(object templete)
            {
                Excel.Workbook book = null;
                try
                {
                    book = _app.Workbooks.Add(templete);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return book;
            }
            /// <summary>
            /// 打开Excel
            /// </summary>
            /// <param name="fileName">文件名</param>
            public Excel.Workbook OpenBook(string fileName)
            {
                Excel.Workbook book = null;
                _fileName = fileName;
                try
                {
                    book = _app.Workbooks.Open(fileName, _missing, _missing, _missing,
                        _missing, _missing, _missing, _missing, _missing, _missing, _missing,
                        _missing, _missing, _missing, _missing);
                }
                catch (Exception ex)
                {

                    throw ex;
                }
                return book;
            }
            /// <summary>
            /// 获得表单对象
            /// </summary>
            /// <param name="workbook"></param>
            /// <param name="sheetIndex"></param>
            /// <returns></returns>
            public Excel.Worksheet GetSheet(Excel.Workbook workbook, int sheetIndex)
            {
                Excel.Worksheet sheet = null;
                try
                {
                    sheet = (Excel.Worksheet)workbook.Sheets[sheetIndex];
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return sheet;
            }
            /// <summary>
            /// 获得表单对象
            /// </summary>
            /// <param name="sheetIndex"></param>
            /// <returns></returns>
            public Excel.Worksheet GetSheet(int sheetIndex)
            {
                InitBook();
                Excel.Worksheet sheet = null;
                try
                {
                    sheet = (Excel.Worksheet)_workbook.Sheets[sheetIndex];
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                return sheet;
            }
            /// <summary>
            /// DataTable数据导入Excel
            /// </summary>
            /// <param name="dtDetail">导出数据的数据源</param>
            /// <param name="columnName">数据源中的字段名称</param>
            /// <param name="columnDiscription">字段描述</param>
            public void DataTableToExcel(DataTable dtDetail, string[] columnName, string[] columnDiscription)
            {
                if (dtDetail == null)
                {
                    return;
                }
                if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
                {
                    return;
                }
                try
                {
                    //设置标题
                    int titleRow = 0;
                    int colsLen = columnName.Length;
                    _worksheet = GetSheet(1);
                    _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                    if (_exportTitle)
                    {
                        titleRow = 1;
                        _range.Merge(0);
                        _range.Value2 = _title;
                        _range.NumberFormat = "@";
                        _range.Font.Size = 20;
                        _range.Font.Bold = true;
                        _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                        _range.RowHeight = 40;
                    }
                    //设置表头
                    _range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
                    _range.Font.Size = 10;
                    _range.Font.Bold = true;
                    _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    _range.NumberFormat = "@";
                    //_range.ColumnWidth = 10;
                    _range.Borders.ColorIndex = 1;
                    for (int i = 1; i <= colsLen; i++)
                    {
                        _worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
                        //_range = (Excel.Range)_worksheet.Cells[1, i];
                        //_range.Value2 = columns;
                    }
                    //导出数据
                    int rowsLen = 2 + titleRow;
                    _range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + dtDetail.Rows.Count, colsLen]);
                    _range.NumberFormat = "@";
                    _range.Font.Size = 10;
                    _range.Borders.ColorIndex = 1;
                    foreach (DataRow dr in dtDetail.Rows)
                    {
                        for (int i = 1; i <= colsLen; i++)
                        {
                            _worksheet.Cells[rowsLen, i] = dr[columnName[i-1]].ToString();
                        }
                        rowsLen++;
                    }
                    _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                    _range.EntireColumn.AutoFit();
                }
                catch (Exception ex)
                {
                   
                    throw ex;
                }
               
            }
            /// <summary>
            /// DataTable数据导入Excel
            /// </summary>
            /// <param name="dtDetail">导出数据的数据源</param>
            /// <param name="columnName">数据源中的字段名称</param>
            /// <param name="columnDiscription">字段描述</param>
            /// <param name="pBar">状态栏进度条</param>
            public void DataTableToExcel(DataTable dtDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
            {
                //数据源为空,字符串数组为空,字段名和字段描述个数不相等,返回
                if (dtDetail == null)
                {
                    return;
                }
                if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
                {
                    return;
                }
                try
                {
                    //设置进度条
                    int detailCount = dtDetail.Rows.Count;
                    pBar.Maximum = detailCount;
                    pBar.Minimum = 0;
                    pBar.Value = 0;
                    pBar.Step = 4;
                    pBar.Visible = true;
                    //设置标题
                    int titleRow = 0;
                    int colsLen = columnName.Length;
                    _worksheet = GetSheet(1);
                    _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                    if (_exportTitle)
                    {
                        titleRow = 1;
                        _range.Merge(0);
                        _range.Value2 = _title;
                        _range.NumberFormat = "@";
                        _range.Font.Size = 20;
                        _range.Font.Bold = true;
                        _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                        _range.RowHeight = 40;
                    }
                    //设置表头
                    _range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
                    _range.Font.Size = 10;
                    _range.Font.Bold = true;
                    _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    _range.NumberFormat = "@";
                    _range.Borders.ColorIndex = 1;
                    for (int i = 1; i <= colsLen; i++)
                    {
                        _worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
                    }
                    //导出数据
                    int rowsLen = 2 + titleRow;
                    _range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + dtDetail.Rows.Count, colsLen]);
                    _range.NumberFormat = "@";
                    _range.Font.Size = 10;
                    _range.Borders.ColorIndex = 1;
                    for (int i = 0; i < detailCount; i++)
                    {
                        if ((i % 4) == 0)
                            pBar.PerformStep();
                        for (int j = 1; j <= colsLen; j++)
                        {
                            _worksheet.Cells[rowsLen, j] = dtDetail.Rows[i][columnName[j - 1]].ToString();
                        }
                        rowsLen++;
                    }
                    _range.EntireColumn.AutoFit();
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    pBar.Visible = false;
                }
            }
            /// <summary>
            /// DataTable数据导入Excel
            /// </summary>
            /// <param name="dtDetail">导出数据的数据源</param>
            /// <param name="columnName">数据源中的字段名称</param>
            /// <param name="columnDiscription">字段描述</param>
            public void DataTableToExcelSaved(DataTable dtDetail, string[] columnName, string[] columnDiscription)
            {

                SaveFileDialog saveDialog = new SaveFileDialog();
                saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

                saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
                saveDialog.FilterIndex = 1;
                saveDialog.RestoreDirectory = true;

                if (saveDialog.ShowDialog() == DialogResult.OK)
                {
                    DataTableToExcel(dtDetail, columnName, columnDiscription);
                }
            }
            /// <summary>
            /// DataTable数据导入Excel
            /// </summary>
            /// <param name="dtDetail">导出数据的数据源</param>
            /// <param name="columnName">数据源中的字段名称</param>
            /// <param name="columnDiscription">字段描述</param>
            /// <param name="pBar">状态栏进度条</param>
            public void DataTableToExcelSaved(DataTable dtDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
            {
                SaveFileDialog saveDialog = new SaveFileDialog();
                saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

                saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
                saveDialog.FilterIndex = 1;
                saveDialog.RestoreDirectory = true;

                if (saveDialog.ShowDialog() == DialogResult.OK)
                {
                    DataTableToExcel(dtDetail, columnName, columnDiscription,pBar);
                }
            }
            /// <summary>
            /// DataGridView数据导入Excel
            /// </summary>
            /// <param name="gvDetail">数据源</param>
            /// <param name="columnName">数据源中字段名称</param>
            /// <param name="columnDiscription">字段描述</param>
            public void DataGridViewToExcel(DataGridView gvDetail, string[] columnName, string[] columnDiscription)
            {
                if (gvDetail == null)
                {
                    return;
                }
                if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
                {
                    return;
                }
                try
                {
                    //设置Excel标题
                    int titleRow = 0;
                    int colsLen = columnName.Length;
                    _worksheet = GetSheet(1);
                    _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                    if (_exportTitle)
                    {
                        titleRow = 1;
                        _range.Merge(0);
                        _range.Value2 = _title;
                        _range.NumberFormat = "@";
                        _range.Font.Size = 20;
                        _range.Font.Bold = true;
                        _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                        _range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
                        _range.RowHeight = 40;
                    }
                    //设置Excel表头
                    _range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
                    _range.Font.Size = 10;
                    _range.Font.Bold = true;
                    _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    _range.NumberFormat = "@";
                    _range.Borders.ColorIndex = 1;
                    for (int i = 1; i <= colsLen; i++)
                    {
                        _worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
                    }
                    //导出数据
                    int rowsLen = 2 + titleRow;
                    _range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + gvDetail.Rows.Count, colsLen]);
                    _range.NumberFormat = "@";
                    _range.Font.Size = 10;
                    _range.Borders.ColorIndex = 1;
                    foreach (DataGridViewRow gvRow in gvDetail.Rows)
                    {
                        for (int i = 1; i <= colsLen; i++)
                        {
                            _worksheet.Cells[rowsLen, i] = gvRow.Cells[columnName[i - 1]].Value.ToString();
                        }
                        rowsLen++;
                    }
                    _range.EntireColumn.AutoFit();
                }
                catch (Exception ex)
                {
                   
                    throw ex;
                }
               
            }
            /// <summary>
            /// DataGridView数据导入Excel
            /// </summary>
            /// <param name="gvDetail">数据源</param>
            /// <param name="columnName">数据源中字段名称</param>
            /// <param name="columnDiscription">字段描述</param>
            /// <param name="pBar">进度条</param>
            public void DataGridViewToExcel(DataGridView gvDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
            {
                if (gvDetail == null)
                {
                    return;
                }
                if (columnName.Length == 0 || columnName.Length != columnDiscription.Length)
                {
                    return;
                }
                try
                {
                    //设置进度条
                    int detailCount = gvDetail.Rows.Count;
                    pBar.Maximum = detailCount;
                    pBar.Minimum = 0;
                    pBar.Value = 0;
                    pBar.Step = 4;
                    pBar.Visible = true;

                    //设置Excel标题
                    int titleRow = 0;
                    int colsLen = columnName.Length;
                    _worksheet = GetSheet(1);
                    _range = _worksheet.get_Range(_worksheet.Cells[1, 1], _worksheet.Cells[1, colsLen]);
                    if (_exportTitle)
                    {
                        titleRow = 1;
                        _range.Merge(0);
                        _range.Value2 = _title;
                        _range.NumberFormat = "@";
                        _range.Font.Size = 20;
                        _range.Font.Bold = true;
                        _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                        _range.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter;
                        _range.RowHeight = 40;
                    }
                    //设置Excel表头
                    _range = _worksheet.get_Range(_worksheet.Cells[1 + titleRow, 1], _worksheet.Cells[1 + titleRow, colsLen]);
                    _range.Font.Size = 10;
                    _range.Font.Bold = true;
                    _range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
                    _range.NumberFormat = "@";
                    _range.Borders.ColorIndex = 1;
                    for (int i = 1; i <= colsLen; i++)
                    {
                        _worksheet.Cells[1 + titleRow, i] = columnDiscription[i - 1];
                    }
                    //导出数据
                    int rowsLen = 2 + titleRow;
                    _range = _worksheet.get_Range(_worksheet.Cells[2 + titleRow, 1], _worksheet.Cells[2 + gvDetail.Rows.Count, colsLen]);
                    _range.NumberFormat = "@";
                    _range.Font.Size = 10;
                    _range.Borders.ColorIndex = 1;
                    for (int i = 0; i < detailCount; i++)
                    {
                        if ((i % 4) == 0)
                            pBar.PerformStep();
                        for (int j = 1; j <= colsLen; j++)
                        {
                            _worksheet.Cells[rowsLen, j] = gvDetail.Rows[i].Cells[columnName[j - 1]].Value.ToString();
                        }
                        rowsLen++;
                    }
                    _range.EntireColumn.AutoFit();
                }
                catch (Exception ex)
                {
                   
                    throw ex;
                }
                finally
                {
                    pBar.Visible = false;
                }
               
            }
            /// <summary>
            /// DataTable数据导入Excel
            /// </summary>
            /// <param name="dtDetail">导出数据的数据源</param>
            /// <param name="columnName">数据源中的字段名称</param>
            /// <param name="columnDiscription">字段描述</param>
            public void DataGridViewToExcelSaved(DataGridView gvDetail, string[] columnName, string[] columnDiscription)
            {

                SaveFileDialog saveDialog = new SaveFileDialog();
                saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

                saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
                saveDialog.FilterIndex = 1;
                saveDialog.RestoreDirectory = true;

                if (saveDialog.ShowDialog() == DialogResult.OK)
                {
                    DataGridViewToExcel(gvDetail, columnName, columnDiscription);
                }
            }
            /// <summary>
            /// DataTable数据导入Excel
            /// </summary>
            /// <param name="dtDetail">导出数据的数据源</param>
            /// <param name="columnName">数据源中的字段名称</param>
            /// <param name="columnDiscription">字段描述</param>
            /// <param name="pBar">状态栏进度条</param>
            public void DataGridViewToExcelSaved(DataGridView gvDetail, string[] columnName, string[] columnDiscription, ToolStripProgressBar pBar)
            {
                SaveFileDialog saveDialog = new SaveFileDialog();
                saveDialog.InitialDirectory = Application.ExecutablePath.ToString();

                saveDialog.Filter = "Excel文件(*.xls)|*.xls|CSV文件(*.csv)|*.csv";
                saveDialog.FilterIndex = 1;
                saveDialog.RestoreDirectory = true;

                if (saveDialog.ShowDialog() == DialogResult.OK)
                {
                    DataGridViewToExcel(gvDetail, columnName, columnDiscription, pBar);
                }
            }

            /// <summary>
            /// 查找Excel文档中的表单并设定其为当前表单,当前表单赋值给CurrentSheet属性
            /// </summary>
            /// <param name="worksheetName">表单名称</param>
            /// <returns>找到时返回真</returns>
            public bool FindExcelWorksheet(Excel.Workbook workbook, string worksheetName)
            {
                bool ATP_SHEET_FOUND = false;

                if ( workbook != null)
                {
                    for (int i = 1; i <= workbook.Worksheets.Count; i++)
                    {
                        _worksheet = (Excel.Worksheet)workbook.Worksheets.get_Item((object)i);
                        if (_worksheet.Name.Equals(worksheetName))
                        {
                            _worksheet.Activate();
                            ATP_SHEET_FOUND = true;
                            return ATP_SHEET_FOUND;
                        }
                    }
                }
                return ATP_SHEET_FOUND;
            }
            /// <summary>
            /// 关闭Excel文档
            /// </summary>
            public void CloseFile()
            {
                _workbook.Close(false,_fileName,false);
            }
            /// <summary>
            /// 终止Excel程序
            /// </summary>
            public void StopExcel()
            {
                if (this._app != null)
                {
                    System.Diagnostics.Process[] pProcess;
                    pProcess = System.Diagnostics.Process.GetProcessesByName("Excel");
                    pProcess[0].Kill();
                }
            }
            /// <summary>
            /// 导入CSV文件到DataSet
            /// </summary>
            /// <param name="fileCSV">文件全路径</param>
            /// <param name="numberOfRows">导入记录个数,-1为全部倒入</param>
            /// <returns></returns>
            public DataSet LoadCSV(string fileCSV, int numberOfRows)
            {
                System.IO.FileInfo fi = new System.IO.FileInfo(fileCSV);
                string fileNevCSV = fi.Name.ToString();
                DataSet ds = new DataSet();
                try
                {
                    string strConn = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + fi.DirectoryName.ToString() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False";
                    string sql;
                    OdbcConnection conn;
                    conn = new OdbcConnection(strConn.Trim());
                    conn.Open();
                    if (numberOfRows == -1)
                    {
                        sql = "select * from [" + fileNevCSV + "]";
                    }
                    else
                    {
                        sql = "select top " + numberOfRows + " * from [" + fileNevCSV + "]";
                    }
                    OdbcDataAdapter da = new OdbcDataAdapter(sql, conn);
                    da.Fill(ds, "csv");
                    conn.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error:导入CSV", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                return ds;
            }
            /// <summary>
            /// 导入Excel文件到DataSet(问题:导入后自动转换格式,有整数和小数的列小数会丢失)
            /// </summary>
            /// <param name="Path"></param>
            /// <returns></returns>
            public DataSet LoadExcel(string Path)
            {
                DataSet ds = new DataSet();
                try
                {
                    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
                    OleDbConnection conn = new OleDbConnection(strConn);
                    conn.Open();
                    string strExcel = "select * from [sheet1$]";
                    OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn);
                    myCommand.Fill(ds, "table1");
                    conn.Close();
                }
                catch (Exception ex)
                {

                    throw ex;
                }
                return ds;
               
            }
        }
    }

  • 相关阅读:
    Cpp Chapter 12: Classes and Dynamic Memory Allocation Part1
    Cpp Chapter 11: Working with Classes Part2
    Cpp Chapter 11: Working with Classes Part1
    Cpp Chapter 10: Objects and Classes Part2
    摄影技术学习
    安装texlive2017(latex的编译软件)
    文献管理工具的使用(Mendeley和Endnote)
    函数的级数展开和渐近展开
    常用英语语法小结
    常微分方程
  • 原文地址:https://www.cnblogs.com/zxjyuan/p/2337554.html
Copyright © 2011-2022 走看看