При преобразовании CSV в XLS в отформатированном шаблоне, почему первый лист не отформатирован? - PullRequest
0 голосов
/ 26 апреля 2019

Создание приложения, которое читает файл CSV и преобразует его в xls с помощью c # в VS 2017.

Я использую CsvHelper и Microsoft.Office.Interop.Excel для достижения этой цели.

Приложение может читать CSV-файл в форме окна, иметь программу, устанавливающую шаблон и вставлять в этот отформатированный шаблон все значения в правильных ячейках ОДНАКО самая первая созданная страница, независимо от того, какой файл используется, не отформатирована и вставляется в неотформатированную страницу Excel.

Я попытался:

  1. изменение аргументов "Workbook.Sheets.Add"
  2. где в логике добавляются листы
  3. изменение аргументов в функции SaveAs
  4. Изменение различных индексов с 1 на 0 и наоборот

Я новичок в работе с пространством имен (Interop.Excel) и потратил много времени на чтение DOCS на веб-странице MS, но до сих пор не могу решить эту проблему.

Вот как я добавляю страницы в рабочую книгу:

if (!backgroundWorker.CancellationPending)
                        {
                            backgroundWorker.ReportProgress(index++ * 100 / pageCount);
                            Thread.Sleep(delay);
                            wb.Sheets.Add(missing,After:wb.Sheets[wb.Sheets.Count],Count:missing,Type:template);
                            Worksheet ws = (Worksheet)wb.Sheets[wb.Sheets.Count];
                        }

Вот как я сохраняю страницы:

wb.SaveAs(fileName, XlFileFormat.xlWorkbookDefault, missing, missing, true, false, XlSaveAsAccessMode.xlNoChange,
                        XlSaveConflictResolution.xlLocalSessionChanges,
                        missing, missing);
                    excel.Quit();

Вот ссылка на весь метод:

namespace csvReader
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        struct DataParameter
        {
            public List<material> materialList;
            public List<material> smallMats;
            public Workbook wbData;
            public string Filename { get; set; }
            public int Delay;
        }

        DataParameter _inputParameter;
private void btnWrite_Click(object sender, EventArgs e)
        {
            if (backgroundWorker.IsBusy)
                return;
            using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook|*.xls" })
            {
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    _inputParameter.Filename = sfd.FileName;
                    _inputParameter.materialList = materialBindingSource2.DataSource as List<material>;
                    _inputParameter.Delay = 100;
                    progressBar.Minimum = 0;
                    progressBar.Value = 0;


                    backgroundWorker.RunWorkerAsync(_inputParameter);
                }
            }
        }
 private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            object missing = Type.Missing;
            List<material> list = ((DataParameter)e.Argument).materialList;
            List<material> cellM = ((DataParameter)e.Argument).smallMats;
            string fileName = ((DataParameter)e.Argument).Filename;
            int pageCount = 1;
            int process = list.Count;
            int setRows = 19;
            int delay = 100;

            if (list.Count > setRows)
            {
                pageCount = process / setRows;
            }
            Microsoft.Office.Interop.Excel.Application excel = new 
    Microsoft.Office.Interop.Excel.Application();
            string template = "(mytemplatefilepath)";
            Workbook wb = ((DataParameter)e.Argument).wbData;
            wb = excel.Workbooks.Add();
            excel.Visible = false;

            int index = 1;

            try
            {
                for (int i = 1; i < pageCount; i++)
                {
                    if (!backgroundWorker.CancellationPending)
                    {
                        backgroundWorker.ReportProgress(index++ * 100 / pageCount);
                        Thread.Sleep(delay);
                        wb.Sheets.Add(missing,After:wb.Sheets[wb.Sheets.Count],Count:missing,Type:template);
                        Worksheet ws = (Worksheet)wb.Sheets[wb.Sheets.Count];
                    }
                }

                int range = 1;
                int sheetIndex = 1;


                foreach (Worksheet w in wb.Sheets)
                {                    
                    w.Name = "Sheet" + sheetIndex++;
                    //w.Cells["L", 3] = tbSpecial.Text;
                    cellM = list.GetRange(range, 19);
                    int startCell = 7;
                    foreach (material m in cellM)
                    {
                        if (!backgroundWorker.CancellationPending)
                        {

                            backgroundWorker.ReportProgress(index++ * 100 / process);
                            Thread.Sleep(delay);
                            Microsoft.Office.Interop.Excel.Range newInput = w.get_Range("C" + startCell, "L" + startCell) as Microsoft.Office.Interop.Excel.Range;                           
                            w.Cells[startCell, 2] = m.Qty.ToString();
                            w.Cells[startCell, 3] = m.Section.ToString();
                            w.Cells[startCell, 4] = m.Length.ToString();
                            w.Cells[startCell, 5] = m.Camber.ToString();
                            w.Cells[startCell, 6] = m.Ends.ToString();
                            w.Cells[startCell, 7] = m.Grade.ToString();
                            w.Cells[startCell, 8] = m.Seq.ToString();
                            w.Cells[startCell, 9] = m.Member.ToString();
                            //w.Cells["L", 3] ="700";
                            startCell++;
                        }
                    }
                    range = range + 19;
                }
                wb.SaveAs(fileName, XlFileFormat.xlWorkbookDefault, missing, missing, true, false, XlSaveAsAccessMode.xlNoChange,
                    XlSaveConflictResolution.xlLocalSessionChanges,
                    missing, missing);
                excel.Quit();
            }
            catch (Exception ex)
            {
                backgroundWorker.CancelAsync();
                MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

Вот первая страница набора данных из 203 страниц

https://imgur.com/t6dd2ip

и другие 202 страницы выглядят так:

https://imgur.com/jMuNMeb

Я чувствую, что это где-то ошибка синтаксиса. Хотя легко заполнить одну страницу Excel, я бы предпочел, чтобы программа выполнила 100% этой работы с использованием технологий, которые я использую.

1 Ответ

1 голос
/ 29 апреля 2019

Причина, по которой на первом листе не было макета шаблона и что если бомбы 'i = 0', заключается в том, что по умолчанию при создании экземпляра рабочей книги с помощью Workbooks.Add () добавляется новый рабочий лист.Этот лист не будет отформатирован, однако в скобках метода Add можно добавить шаблон для придания этому первому листу такого формата.

string template = "C:/whereEverMyTemplateIs/template"
 wb = excel.Workbooks.Add(template);

Тогда просто помните, что он добавлен, и сделайте столько, сколько нужно

for (int i = 1; i < pageCount; i++)
                {
                    if (!backgroundWorker.CancellationPending)
                    {
                        backgroundWorker.ReportProgress(index++ * 100 / pageCount);
                        Thread.Sleep(delay);
                        wb.Sheets.Add(missing,After:wb.Sheets[wb.Sheets.Count],Count:missing,
Type:template);
                        //Worksheet ws = (Worksheet)wb.Sheets[wb.Sheets.Count];
                    }
                }
...