エクセルシート名には、命名規則がありまして、
Excel2003で空文字のシート名をつけようとするとダイアログが表示されて、
文字列長の制約と、下記禁則文字の仕様が表示される。
・入力した名前に次の文字が含まれていないことを確認します: コロン(:)、円記号()、スラッシュ(/)、疑問符(?)、アスタリスク(*)、左角かっこ([)、右角かっこ(])
ネット上の公式な情報は下記URLくらいの様子?
[XL2003]シート名に関する仕様および制限について
https://support.microsoft.com/ja-jp/kb/436482
- 禁則文字の全角文字もだめなんだそうだ。
以下、禁則文字を正規表現で削除するコードについて数種言語の実装をメモしておく。
※文字列長についてのチェックはしないです
※あと、ブック内で一意になるチェックとかも実際には要ると思う
とりあえず正規表現
[:\\?\[\]/*:¥\?[]/*]
- 「履歴」というマジック的な禁止文字もあるらしいが、それは無視
vb(.net)でエクセルシート名の禁則文字を削除する
ExcelSheetNameRegexSample.vb
Module Module1
ReadOnly SheetNameForbiddenRegex As New System.Text.RegularExpressions.Regex("[:\\?\[\]/*:¥\?[]/*]")
Sub Main()
Dim origSheetName = "prefix<:\?[]/*:¥\?[]/*>suffix"
Dim okSheetName = SheetNameForbiddenRegex.Replace(origSheetName, "")
Console.WriteLine(okSheetName) 'prefix<>suffix
End Sub
End Module
vbはエスケープシーケンス的なものが(他言語より)特殊なので、正規表現をそのまま書ける。
C#でエクセルシート名の禁則文字を削除する
ExcelSheetNameRegexSample.cs
using System;
using System.Text.RegularExpressions;
namespace ExcelSheetNameRegexSample
{
class Program
{
static readonly Regex SheetNameForbiddenRegex = new Regex("[:\\\\?\\[\\]\\/*:¥\?[]/*]");
static void Main(string[] args)
{
var origSheetName = "prefix<:\\?[]/*:¥\?[]/*>suffix";
var okSheetName = SheetNameForbiddenRegex.Replace(origSheetName, "");
Console.WriteLine(okSheetName); //prefix<>suffix
}
}
}
javaでエクセルシート名の禁則文字を削除する
ExcelSheetNameRegexSample.java
package sample;
import java.util.regex.Pattern;
public class ExcelSheetNameRegexSample {
static final Pattern SHEET_NAME_FORBIDDEN_PATTERN = Pattern.compile("[:\\\\?\\[\\]\\/*:¥\?[]/*]");
public static void main(String[] args) {
String origSheetName = "prefix<:\\?[]/*:¥\?[]/*>suffix";
String okSheetName = SHEET_NAME_FORBIDDEN_PATTERN.matcher(origSheetName).replaceAll("");
System.out.println(okSheetName); //prefix<>suffix
}
}
rubyでエクセルシート名の禁則文字を削除する
sheet_name_forbidden_regexp.rb
SHEET_NAME_FORBIDDEN_REGEXP = Regexp.new("[:\\\\?\\[\\]\\/*:¥\?[]/*]")
orig_sheet_name = 'prefix<:\?[]/*:¥\?[]/*>suffix'
ok_sheet_name = orig_sheet_name.gsub(SHEET_NAME_FORBIDDEN_REGEXP, '')
puts ok_sheet_name #prefix<>suffix