• C# 导入(读取) WPS ET文件


    本文章介绍基于VS2010 Winform 的WPS2016二次开发 ET数据读取程序 本程序支持多个Sheet页面

    前提:引用WPS安装目录下的etapi.dll

    private void button2_Click(object sender, EventArgs e)
    {
    //初始化表头
    List<string[]> columnTextsList = new List<string[]>();
    string[] strColumnTexts1 = { "企业名称", "企业类型" };
    string[] strColumnTexts2 = { "产品编码", "产品名称", "产品类别" };
    columnTextsList.Add(strColumnTexts1);
    columnTextsList.Add(strColumnTexts2);

    OpenFileDialog fileDialog = new OpenFileDialog();
    ////(*.txt)|*.txt|
    fileDialog.Filter = "(*.et)|*.et";
    fileDialog.FilterIndex = 1;
    fileDialog.RestoreDirectory = true;
    if (fileDialog.ShowDialog() == DialogResult.OK)
    {
    List<ClinetUtil> clientList = new List<ClinetUtil>();
    ExcelToDataSet(fileDialog.FileName, columnTextsList, new Action<string, DataSet>(delegate(string msg, DataSet ds)
    {
    if (ds != null && ds.Tables.Count > 0)
    {
    dgv1.DataSource = ds.Tables[0];
    if (ds.Tables.Count > 1)
    {
    dgv2.DataSource = ds.Tables[1];
    }
    }
    else
    {
    MessageBox.Show(msg);
    }
    }));
    }
    }

    /// <summary>
    /// 读取et表格数据转换成dataSet
    /// </summary>
    /// <param name="fileName">et表格全路径</param>
    /// <param name="columnTextsList">规定的表头列表(支持多sheet)</param>
    /// <param name="callback">回调函数</param>
    private void ExcelToDataSet(string fileName, List<string[]> columnTextsList, System.Action<string, DataSet> callback)
    {
    /*
    说明:
    * 1.Excel读取的顺位从1开始,而不是从0开始
    * 2.Excel.Application 当系统中同时安装Excel和et 时则启动Excel.exe ;若只存在et 时,则启动et.exe
    *
    */
    string msg = "";
    List<string> headerList = new List<string>();
    DataSet dataSet = new DataSet();

    Excel.Application appli = new Excel.Application();
    try
    {
    //读取Excel
    Excel._Workbook wk = appli.Workbooks.Open(fileName);
    //读取sheet
    int sheetsCount = wk.Worksheets.Count;//获取sheet数量
    if (sheetsCount <= 0)
    {
    appli.Workbooks.Close();
    appli.Quit();
    callback(msg, dataSet);
    }

    if (columnTextsList.Count > sheetsCount)
    {
    msg = string.Format("导入表格的sheet数量不符合要求!");
    appli.Workbooks.Close();
    appli.Quit();
    callback(msg, dataSet);
    return;
    }

    //遍历每一个sheet页面
    for (int k = 1; k <= sheetsCount; k++)
    {
    //如果sheet页面的数量大于规定的数量 跳出方法
    if (k > columnTextsList.Count) break;

    DataTable dt = new DataTable();
    Excel.Worksheet sheet = wk.Worksheets.get_Item(k);
    Excel.Range range = sheet.UsedRange;

    int rowCount = range.Rows.Count;//获取行数
    int columCount = range.Columns.Count;//获取列数

    //设置列头
    for (int j = 1; j <= columCount; j++)
    {
    dt.Columns.Add(((Excel.Range)range.get_Item(1, j)).Text);
    }

    //验证Excel中的列是否缺失
    for (int i = 0; i < columnTextsList[k - 1].Length; i++)
    {
    if (!dt.Columns.Contains(columnTextsList[k - 1][i]))
    {
    msg = string.Format("要导入的文件第"{0}"个sheet页面缺少"{1}"列,请使用正确的模板!", k, columnTextsList[k - 1][i].Trim());
    appli.Workbooks.Close();
    appli.Quit();
    callback(msg, dataSet);
    return;
    }
    }

    for (int i = 2; i <= rowCount; i++)
    {
    DataRow datarow = dt.NewRow();
    for (int j = 1; j <= columCount; j++)
    {
    string title = ((Excel.Range)range.get_Item(j)).Text;
    datarow[title] = range.get_Item(i, j).Text;
    }
    dt.Rows.Add(datarow);
    }
    dataSet.Tables.Add(dt);
    }

    //关闭相关程序
    appli.Workbooks.Close();
    appli.Quit();
    callback(msg, dataSet);
    }
    catch (Exception ex)
    {
    appli.Workbooks.Close();
    appli.Quit();
    callback(msg, dataSet);
    return;
    }
    }

  • 相关阅读:
    包装器
    高级new创建
    野性的呼唤 第三章
    SourceTree的基本使用
    SAP的春天回来么?
    dirname命令和basename命令
    一个简单的ETL脚本的内容
    轮子:读取config.ini文件
    sed基础语法
    hivesql之str_to_map函数
  • 原文地址:https://www.cnblogs.com/lsmhome/p/9323899.html
Copyright © 2020-2023  润新知