C#에서 Excel 북의 "이름"을 모두 지우기
동기
오래된 엑셀 파일을 복사해 사용하고 있으면, 때때로 나온다
수동으로 지울 때
이거
전체 선택을 할 수 없고, 하나씩 지우는 날개가 된다. 수가 많으면 스트레스가 좋다 · ·
정말 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
로 컴파일 할 수 있습니다.
Reference
이 문제에 관하여(C#에서 Excel 북의 "이름"을 모두 지우기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kob58im/items/e8a3a79a57dae322c6f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이거
전체 선택을 할 수 없고, 하나씩 지우는 날개가 된다. 수가 많으면 스트레스가 좋다 · ·
정말 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
로 컴파일 할 수 있습니다.
Reference
이 문제에 관하여(C#에서 Excel 북의 "이름"을 모두 지우기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kob58im/items/e8a3a79a57dae322c6f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
로 컴파일 할 수 있습니다.
Reference
이 문제에 관하여(C#에서 Excel 북의 "이름"을 모두 지우기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kob58im/items/e8a3a79a57dae322c6f8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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 ^
%*
Reference
이 문제에 관하여(C#에서 Excel 북의 "이름"을 모두 지우기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kob58im/items/e8a3a79a57dae322c6f8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)