【问题标题】:Convert excel file (xls or xlsx) to csv file将 excel 文件(xls 或 xlsx)转换为 csv 文件
【发布时间】:2015-07-09 11:47:47
【问题描述】:

我需要此代码 C# 用于文件 excel 2003 和 2007 版本。

我无法让这个 C# 代码在 csv 文件上转换 excel 文件 (xls)。

如果尝试使用 excel 文件扩展名 xlsx 一切正常,但如果尝试使用扩展名 xls 我在这一行有错误:

result.Tables[0].TableName.ToString();

我下面的代码,怎么了?

代码隐藏

FileUploadControl.SaveAs(Server.MapPath("/public/") + filename);

System.IO.FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);

Excel.IExcelDataReader excelReader = Excel.ExcelReaderFactory.CreateOpenXmlReader(stream);
DataSet result = excelReader.AsDataSet();
excelReader.Close();

result.Tables[0].TableName.ToString();

string csvData = "";
int row_no = 0;
int ind = 0;

while (row_no < result.Tables[ind].Rows.Count)
{
    for (int i = 0; i < result.Tables[ind].Columns.Count; i++)
    {
        csvData += result.Tables[ind].Rows[row_no][i].ToString() + ",";
    }
    row_no++;
    csvData += "\n";
}

keys = GetUniqueKey(8).ToUpper();
output = System.Web.HttpContext.Current.Server.MapPath("/public/target_" + keys.ToString() + ".csv");
StreamWriter csv = new StreamWriter(@output, false);
csv.Write(csvData);
csv.Close();

【问题讨论】:

标签: c# excel export-to-csv


【解决方案1】:

Excel 可以有两种类型:

  1. 二进制 - Excel 2003 和更早版本 - xls
  2. Zip - 基于 Open Office XML 标准 - Excel 2007 及更高版本 - xlsx

您应该尝试对旧的 excel 格式文件使用以下内容:

ExcelReaderFactory.CreateBinaryReader(stream);

【讨论】:

    【解决方案2】:

    使用任何 Xls 到 Xslx 对话工具。你可以试试 Aspose 库。我认为它已获得许可,但您可以尝试试用版。

    您也可以使用这些库进行所有其他转换。

    【讨论】:

      【解决方案3】:

      我是这样做的 - OLEDB - 获取第一个工作表名称,并删除所有空行。替换 //whatever you need to do with your logic。

          //Your Method signature
          {
              //create connection string
              var connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path +
                  ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";
      
              //process
              using (var conn = new OleDbConnection(connStr))
              {
                  conn.Open();
      
                  //programatically get the first sheet, whatever it is named.
                  var sheetName = GetSheetNames(conn)[0].SheetNameOf;
      
                  var adapter = new OleDbDataAdapter(String.Format("SELECT * FROM [{0}]", sheetName), connStr);
                  var ds = new DataSet();
      
                  adapter.Fill(ds, "anyNameHere");
      
                  var data = ds.Tables["anyNameHere"];
      
                  //copy and remove blank lines
                  var resData = data.Clone();
                  var filteredData = data.Rows.Cast<DataRow>().Where(
                      row => !row.ItemArray.All(
                          field => field is DBNull ||
                                   field == null ||
                                   (String.IsNullOrEmpty(field.ToString().Trim())))
                      );
                  filteredData.CopyToDataTable(resData, LoadOption.OverwriteChanges);
      
                  var newData = resData.AsEnumerable();
      
                  //whatever you need to do
          }
      
          public List<SheetName> GetSheetNames(OleDbConnection conn)
          {
              if (conn.State != ConnectionState.Open)
              {
                  conn.Open();
              }
              DataTable excelSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
      
              var sheetNames = (from DataRow row in excelSchema.Rows
                                where !row["TABLE_NAME"].ToString().Contains("FilterDatabase")
                                select new SheetName { SheetNameOf = row["TABLE_NAME"].ToString() }
                                ).ToList();
              conn.Close();
              return sheetNames;
          }
      

      【讨论】:

        【解决方案4】:

        您可以使用 Aspose.Cells 将 xls 或 xlsx 等 excel 文件转换为 csv 格式,只需以下简单代码。

        string filePath = @"F:\Downloads\source.xlsx";
        
        Workbook workbook = new Workbook(filePath);
        workbook.Save("output.csv", SaveFormat.CSV);
        

        注意:我在 Aspose 担任开发布道师。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-11
          • 1970-01-01
          • 1970-01-01
          • 2013-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多