C#에서 Excel 북의 "이름"을 모두 지우기

9791 단어 ExcelC#

동기



오래된 엑셀 파일을 복사해 사용하고 있으면, 때때로 나온다

수동으로 지울 때



이거



전체 선택을 할 수 없고, 하나씩 지우는 날개가 된다. 수가 많으면 스트레스가 좋다 · ·
정말 MS Office는 빌어 먹을 ...

주의사항



함부로 「이름」을 지우면, 수식이나 매크로가 동작하지 않게 될 우려가 있습니다.
그 엑셀 자체로 사용하고 있지 않아도, 다른 툴이 그 엑셀 파일내의 「이름」의 사용을 전제로 한 시스템이 되어 있는 경우도 있을 수 있습니다.

소스 코드



using System;
using System.Drawing;
using System.Runtime.CompilerServices; // to use [MethodImpl(MethodImplOptions.NoInlining)]
using System.Runtime.InteropServices;
//using System.Text.RegularExpressions;
using System.Windows.Forms;

using Excel = Microsoft.Office.Interop.Excel;
//using Microsoft.Office.Core;

class ExcelNameRemover : Form
{
    Button btnStartTryGet;


    [MethodImpl(MethodImplOptions.NoInlining)]
    void TryGetActiveBook()
    {
        try {
            var oExcelApp = (Excel.Application)Marshal.GetActiveObject("Excel.Application");

            if (oExcelApp == null) {return;}

            dynamic book;
            book = oExcelApp.ActiveWorkbook;

            var res = MessageBox.Show("Are you sure to delete all names in the excel: \"" + book.Name+"\"", "Confirmation", MessageBoxButtons.OKCancel );
            if (res == DialogResult.OK ) {
                dynamic names = book.Names;
                int count=0;
                foreach(dynamic name in names){
                    name.Delete();
                    count++;
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }
                Console.WriteLine(count.ToString() + " names are deleted.");
            }
        }
        catch(Exception e) {
            if (e is Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ||
                e is COMException ) {

                Console.WriteLine(e);
                // もみ消す
                return;
            }
            throw e;
        }
        finally {
        }
    }


    ExcelNameRemover()
    {
        Controls.Add(btnStartTryGet = new Button(){
            Text = "Remove all names",
            Location = new Point(0, 0),
            Width = 200
        });
        btnStartTryGet.Click += (s,e)=>{
            TryGetActiveBook();
            GC.Collect();
            GC.WaitForPendingFinalizers();
        };
    }

    [STAThread]
    static void Main(string[] args)
    {
        //DumpTextOfActiveSheet();
        Application.Run(new ExcelNameRemover());
    }
}

컴파일 방법



※dll의 경로는 환경에 의존한다고 생각합니다.

compile.bat

csc ^
 /r:C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll ^
 /r:C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c\Office.dll ^
 %*
compile.bat ファイル名.cs로 컴파일 할 수 있습니다.

좋은 웹페이지 즐겨찾기