Как изменить формат ячеек Excel с помощью C #

1

IHi Я пытаюсь читать плоский файл n, чтобы преуспеть. Я могу генерировать файл excel с использованием datatable, но поля даты отображаются как #####. Я пытаюсь изменить формат ячеек, но не могу. Я добавил код для справки. любезно направляйте меня, поскольку мне нужно создать еще один лист из этого сгенерированного листа вместе с формулами. Самое забавное в этом - я вижу даты как

на этом листе, но если я скопирую эти данные на другом листе, я могу увидеть поля дат вместо #####.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using Microsoft.Office.Interop.Excel;
using System.Threading.Tasks;
using System.Reflection;

namespace report
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"flat.txt";  //Flat file
            System.Data.DataTable table = ReadFile(path);
            Excel_FromDataTable(table);

        }
    private static System.Data.DataTable ReadFile(string path)
    {
        System.Data.DataTable table = new System.Data.DataTable("dataFromFile");
        DataColumn colu;
        for (int i = 0; i < 250; i++)
        {
            colu = new DataColumn("", System.Type.GetType("System.String"));
            colu.AllowDBNull = true;
            table.Columns.Add(colu);
        }
         using (StreamReader sr = new StreamReader(path))
        {
            string line;
            int rowsCount = 0;
            while ((line = sr.ReadLine()) != null)
            {
                string[] data = line.Split(new string[] { "|" },StringSplitOptions.None);// Separated by delimiter |
                table.Rows.Add();
                for (int i = 0; i < data.Length; i++)
                {
                    //if (data[i].Contains(""))
                    //if (data[i].Equals(""))
                    //    table.Rows[rowsCount][i] = "---";
                    //    data[i] = "   ";
                    if (!data[i].Equals(""))
                        table.Rows[rowsCount][i] = data[i];

                }
                rowsCount++;
            }
        }
        return table;

    }
     private static void Excel_FromDataTable(System.Data.DataTable dt)
    {

        //create an excel object and add to a work book....

        Application excel = new Application(); //check if you can use ApplicationClass
        Workbook workbook = excel.Application.Workbooks.Add(true);


        //add coulmn heading...
        int iCol = 0;
        foreach (DataColumn c in dt.Columns)
        {
            iCol++;
            excel.Cells[1, iCol] = c.ColumnName;
        }

        //add row
        int iRow = 0;
        foreach (DataRow r in dt.Rows)
        {
            iRow++;

            //add each row cell data...
            iCol = 0;
            foreach (DataColumn c in dt.Columns)
            {
                iCol++;
                excel.Cells[iRow + 1, iCol] = r[c.ColumnName];
            }

        }
        //Globalmissing refernce for objects we are not defining...

        object missing = System.Reflection.Missing.Value;

                    //excel.get_Range("C3", iRow).NumberFormat = "mm/dd/yyyy";
        workbook.SaveAs(@"C:/report.xls", XlFileFormat.xlXMLSpreadsheet, missing, missing, false, false, XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing, missing);
        // If wanting to make Excel visible and activate the worksheet 
        excel.Visible = true;



    }
    }
  }

   Excel file is like this





Column1 Column2 Column3
AAA #########   103
D-1 17        ########
D-2   17            ########
D-3 17  ########
  • 0
    знаете ли вы столбец Имя поля даты, если так, почему бы не добавить условную проверку в ваш код, который форматирует DateFiled, или назначить эти поля в виде строкового представления, добавив к нему префикс #mmddyyyy# и добавив # в конце этого поля? смысл..?
  • 0
    также, поскольку вы анализируете данные в строковый массив. используйте отладчик, чтобы просмотреть их в начальном разбиении и посмотреть, например, какую позицию data[8] и проверить, какое значение data [i] и если оно не = в строку. пусто или не пусто, затем отформатируйте его как строку прямо в цикле функции split
Показать ещё 4 комментария
Теги:
excel
office-interop

2 ответа

1
Лучший ответ

Поле даты отображается как ######, потому что дата больше, чем столбец. Попробуйте изменить размер столбцов.

sheet.Columns.AutoFit();

Также попробуйте:

sheet.Cells[row, column] = String.Format("{0:MM/dd/yyyy}", object.DateEntered);

Обновленный ответ:

    int iRow = 0;
    foreach (DataRow r in dt.Rows)
    {
        iRow++;

        //add each row cell data...
        iCol = 0;
        foreach (DataColumn c in dt.Columns)
        {
            iCol++;

            try
            {
                DateTime date = Convert.ToDateTime(r[c.ColumnName]);
                excel.Cells[iRow + 1, iCol] = String.Format("{0:MM/dd/yyyy", date);
            }
            catch(Exception e)
            {
                excel.Cells[iRow + 1, iCol] = r[c.ColumnName];
            }

        }

    }
  • 1
    -1 это поле даты ..? прочитайте вопрос еще раз,
  • 0
    Не обязательно поля даты, содержащие отрицательные даты, также могут отображаться как #####, даже если они помещаются в ячейку
Показать ещё 14 комментариев
1

Вот простой метод, который я написал, который преобразует любой DataTable в CSV

//Declared at the class Level 
private const string tableDelim = "|";

private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
{
    csvData = new DataTable(defaultTableName);
    try
    {
        using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
        {
            csvReader.SetDelimiters(new string[]
            {
                //this will be a constant declared at the class level private const string tableDelim = ",";
                tableDelim 
            });
            csvReader.HasFieldsEnclosedInQuotes = true;
            string[] colFields = csvReader.ReadFields();

            foreach (string column in colFields)
            {
                DataColumn datecolumn = new DataColumn(column);
                datecolumn.AllowDBNull = true;
                csvData.Columns.Add(datecolumn);
            }

            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                //Making empty value as null
                for (int i = 0; i < fieldData.Length; i++)
                {
                    if (fieldData[i] == string.Empty)
                    {
                        fieldData[i] = string.Empty; //fieldData[i] = null
                    }
                    //Skip rows that have any csv header information or blank rows in them
                    if (fieldData[0].Contains("Disclaimer") || string.IsNullOrEmpty(fieldData[0]))
                    {
                        continue;
                    }
                 }
                 csvData.Rows.Add(fieldData);
            }
        }
    }
    catch (Exception ex)
    {
      //write your own Exception Messaging here
    }
    return csvData;
}

Преобразуйте файл.CSV и сохраните его как.XLS-формат, это хорошая простая ссылка из Stackoverflow, а также Преобразование ExcelFile.CSV в формат.XLS

  • 0
    Спасибо, но мы ищем файл Excel
  • 1
    Excel откроет .csv файл между прочим .. так что это в основном то же самое

Ещё вопросы

Сообщество Overcoder
Наверх
Меню