View Single Post
  #18   Report Post  
Posted to microsoft.public.excel.programming
NickHK NickHK is offline
external usenet poster
 
Posts: 4,391
Default Invalid Characters in Worksheet Name (International)

I don't have C#, but if you can make a DLL callable from VB, I can test on
Chinese Windows/Office.

NickHK

"Drew Lettington" wrote in
message ...
Thank you to everyone who replied. For your information, here is the

final
C# code I added to my application. It uses Microsoft.VisualBasic to

access
the VB string conversion code to 'narrow' the wide yen character. This

works
for Japanese and I assume will work for all Asian languages but I can't

test
since I don't have access to those Office versions.

private string ValidSheetName(string sheetName)
{
string validSheetName = String.Empty;
char [] invalidChars = new char [] {':', '\\', '/', '?', '*', '[',

']'};[i]
const string truncate = "...";
const char replace = '_';
const int maxSheetNameLen = 31;

if (sheetName.Length maxSheetNameLen)
{
// Character limit on sheet names would be exceeded, truncate
validSheetName = sheetName.Substring(0, maxSheetNameLen
-truncate.Length) + truncate;
}
else
{
validSheetName = sheetName;
}

// Some characters are invalid in worksheet names in all locales
for (int i = 0; i < invalidChars.Length; i++)
{
validSheetName = validSheetName.Replace(invalidChars[i], replace);
}

try
{
string narrowSheetName =
Microsoft.VisualBasic.Strings.StrConv(validSheetNa me,
Microsoft.VisualBasic.VbStrConv.Narrow,
System.Threading.Thread.CurrentThread.CurrentCultu re.LCID);

if (narrowSheetName != validSheetName)
{
// Something was narrowed, check for separator again
for (int i = 0; i < narrowSheetName.Length; i++)
{
if (narrowSheetName[i] == Path.DirectorySeparatorChar)
{
// Found the wide separator, now replace them all
validSheetName =
validSheetName.Replace(validSheetName, replace);
break;
}
}
}
}
catch
{
// Narrowing doesn't apply to all locales, nothing to do
}

// Check for blank name
if (validSheetName.Trim().Length == 0)
{
validSheetName = replace.ToString();
}

return validSheetName;
}

"Drew Lettington" wrote:

I have some code that creates a new worksheet from a name provided by a

user.
The code checks the user input for invalid characters before creating

the
name, eliminating : @ \ / ? * [ ]. The code worked fine running English
Excel but when I ran using Japanese Excel I had a problem.

In the Japanese environment the user provided a name that contained the

yen
(?) character. My code checked for \ which is the directory path

separator
in Japanese and displays as the yen symbol. But since the user's name

had
the actual yen character my code failed to create a valid worksheet

name.

I could modify my code to explicitly check for the yen character and it
would fix the problem. However, yen character is valid in English Excel

so I
don't want to replace it in that environment. I also can't just check

thread
locale or regional settings or something similar as English Excel could

be
running on a Japanese system.

My question then, is it possible to programatically determine at runtime
which characters are invalid in worksheet names? For example, is there

an
Excel call that would return a list of invalid characters which I could

then
removed from any proposed worksheet names?

- Drew