簡體   English   中英

循環使用Excel文件並使用C#在單獨的文件中復制正確的范圍

[英]Loop through Excel files and copy correct range in a separate file with C#

簡介:今天我決定使用C#進行Excel自動化任務。 這可能是我第一次做這樣的事情,因此問題很多。

任務:差不多,這個想法如下 - 我在文件夾strPath有4個excel文件。 我必須循環遍歷所有這些文件並在同一文件夾中創建一個名為Report.xlsx的文件,其中包含這些文件中的信息。

我需要的信息是第9行下面的任何信息。因此,要復制的第一行是第10行。這就是為什么,我循環的第一個文件保存為Report,並且bMakeOnce值被更改。 在第一個文件循環並保存為As后,我開始進入else條件。 在那里,我找到XL文件的最后一行,我嘗試將范圍復制到sheetReport。

問題:

  1. 首先 - 任何代碼改進的想法;

  2. 每當我循環瀏覽文件時,我得到以下圖片,告訴我每個循環文件​​已經打開。 在此輸入圖像描述

  3. 有什么好主意如何更好地進行范圍復制? 目前,我只是嘗試將復制的范圍放在每200 + n行,以避免一些混淆。

  4. 知道為什么我在sheetReport中沒有得到任何東西,除了第一個文件?

我正在使用的代碼(最初,對於下面的當前goto Github):

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Text;
     using System.Threading.Tasks;
     using System.IO;
     using System.Reflection;
     using Excel = Microsoft.Office.Interop.Excel;
     using Word = Microsoft.Office.Interop.Word;

    class MainClass
    {
        static void Main()
        {
            string strPath = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), @"..\..\..\"));
            string[] strFiles = Directory.GetFiles(strPath);
            Excel.Application excel = null;
            bool bMakeOnce = true;

            int intFirstLine = 10;
            int intLastColumn = 50;
            int lastRow;
            int lastRowReport;

            Excel.Workbook wkbReport = null;
            string strWkbReportPath;
            int n = 0;

            foreach (string strFile in strFiles)
            {
                Console.WriteLine(strFile);
                Excel.Workbook wkb = null;
                Excel.Worksheet sheet = null;
                Excel.Worksheet sheetReport = null;

                Excel.Range rngLast = null;
                Excel.Range rngLastReport = null;
                Excel.Range rngToCopy = null;
                Excel.Range rngDestination = null;

                excel = new Excel.Application();
                excel.Visible = true;

                wkb = OpenBook(excel, strFile);
                if (bMakeOnce)
                {
                    bMakeOnce = false;
                    strWkbReportPath = wkb.Path + "\\" + "Report.xlsx";
                    wkb.SaveAs(strWkbReportPath);
                    wkbReport = OpenBook(excel, strWkbReportPath);
                }
                else
                {
                    wkb = OpenBook(excel, strFile);
                    sheetReport = wkbReport.Worksheets[1];
                    sheet = wkb.Worksheets[1];
                    n++;
                    rngLastReport = sheetReport.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
                    rngLast = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);

                    rngToCopy = sheet.Range[sheet.Cells[intFirstLine, 1], sheet.Cells[rngLast.Row, intLastColumn]];
                    int size = rngToCopy.Rows.Count;
                    Console.WriteLine(size);

                    rngDestination = sheetReport.Range[sheetReport.Cells[200 * n, 1], sheetReport.Cells[200 * n + size, intLastColumn]];

                    rngToCopy.Copy(rngDestination);
                    //rngDestination.PasteSpecial(Excel.XlPasteType.xlPasteAll);
                }
            }
            wkbReport.Close(false);
            excel.Quit();
        }

        public static Excel.Workbook OpenBook(Excel.Application excelInstance, string fileName, bool readOnly = false, bool editable = true, bool updateLinks = true)
        {
            Excel.Workbook book = excelInstance.Workbooks.Open(
                fileName, updateLinks, readOnly,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing);
            return book;
        }
    }

現在它以某種方式工作,產生我想要的東西:

using System;
using System.IO;
using Excel = Microsoft.Office.Interop.Excel;

class MainClass
{
    static void Main()
    {
        string strPath = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), @"..\..\..\"));
        string[] strFiles = Directory.GetFiles(strPath);
        Excel.Application excel = null;
        bool bMakeOnce = true;
        string strReportName = "Report.xlsx";
        int intFirstLine = 10;
        int intLastColumn = 50;
        int lastRow;
        int lastRowReport;
        int intTotalRows;

        Excel.Workbook wkbReport = null;
        string strWkbReportPath;
        int n = 0;

        excel = new Excel.Application();
        excel.Visible = true;

        foreach (string strFile in strFiles)
        {
            if (strFile.Contains(strReportName))
            {
                Console.WriteLine(strReportName + " is deleted.");
                File.Delete(strFile);
            }
        }

        foreach (string strFile in strFiles)
        {
            if (strFile.Contains(strReportName))
            {
                continue;
            }
            Console.WriteLine(strFile);
            Excel.Workbook wkb = null;
            Excel.Worksheet sheet = null;
            Excel.Worksheet sheetReport = null;
            Excel.Range rngLastReport = null;
            Excel.Range rngToCopy = null;

            wkb = Open(excel, strFile);
            if (bMakeOnce)
            {
                bMakeOnce = false;
                strWkbReportPath = wkb.Path + "\\" + strReportName;
                wkb.SaveAs(strWkbReportPath);
                wkb.Close();
                wkbReport = Open(excel, strWkbReportPath);
            }
            else
            {   
                sheetReport = wkbReport.Worksheets[1];
                sheet = wkb.Worksheets[1];

                //lastRow = sheet.Cells[1, 3].get_End(Excel.XlDirection.xlUp).Row;

                intTotalRows = sheet.Rows.Count;
                lastRow = sheet.Cells[intTotalRows, 1].End(Excel.XlDirection.xlUp).Row;
                lastRowReport = sheetReport.Cells[intTotalRows, 1].End(Excel.XlDirection.xlUp).Row;

                //lastRowReport = sheetReport.Cells[intTotalRows, 1].get_End(Excel.XlDirection.xlUp).Row;
                //lastRowReport = sheetReport.Cells[intTotalRows, intTotalRows.End[Excel.XlDirection.xlUp]].Row;
                n++;

                rngToCopy = sheet.Range[sheet.Cells[intFirstLine,1],sheet.Cells[lastRow, intLastColumn]];
                int size = rngToCopy.Rows.Count;
                rngLastReport = sheetReport.Range[sheetReport.Cells[lastRowReport+1, 1], sheetReport.Cells[lastRowReport + 1+size, intLastColumn]];

                rngToCopy.Copy(rngLastReport);
                wkb.Close(false);
            }
        }
        wkbReport.Close(true);
        excel.Quit();
        Console.WriteLine("Finished!");
    }

    public static Excel.Workbook Open(Excel.Application excelInstance, string fileName, bool readOnly = false, bool editable = true, bool updateLinks = true)
    {
        Excel.Workbook book = excelInstance.Workbooks.Open(
            fileName, updateLinks, readOnly,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing);
        return book;
    }
    //public static Excel.Workbook OpenBook(Excel.Application excelInstance, string fileName, bool readOnly = false, bool editable = true, bool updateLinks = true)
    //{
    //    Excel.Workbook book = excelInstance.Workbooks.Open(
    //        fileName, updateLinks, readOnly,
    //        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    //        Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
    //        Type.Missing, Type.Missing);
    //    return book;
    //}

}

因此,我在這里提出了codeReview: https ://codereview.stackexchange.com/questions/153054/loop-through-excel-files-and-copy-correct-range-in-a-separate-file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM