/// <summary> /// Setup Filters /// </summary> /// <param name="fd"></param> /// <param name="defaultExt"></param> /// <param name="fltrs"></param> /// <returns>Index of initial filter</returns> static int SetupFilters( string filter, string defaultExt, Microsoft.Office.Core.FileDialog fd) { FileDialogFilters fltrs = null; if (fd != null) // only setup if fd is defined { fltrs = fd.Filters; fltrs.Clear(); } string[] sa = filter.Split(','); int sfi = 0; for (int fi = 0; fi < sa.Length; fi += 2) { string desc = sa[fi]; string ext = sa[fi + 1]; if (fltrs != null) { fltrs.Add(desc, ext); } if (Lex.Contains(ext, defaultExt)) // selected filter { sfi = fi / 2 + 1; } } if (sfi == 0 && sa.Length > 0) { sfi = 1; } if (fltrs != null) { fd.FilterIndex = sfi; // set the filter index } return(sfi); }
private void SaveWorkSheet(Workbook wb, bool saveasui, ref bool cancel, bool reOpen) { // 不需要保存处理的话,直接返回 if (!SettingsCsv.Default.EnableSaveEncode) { return; } string fileName = wb.FullName; if (!fileName.ToLower().EndsWith(".csv")) { return; } if (!fileDict.ContainsKey(fileName)) { Encoding encoding = GetFileEncoding(fileName); fileDict[fileName] = encoding; } Encoding fileEncoding = fileDict[fileName]; if (Equals(fileEncoding, Encoding.UTF8) || Equals(fileEncoding, Encoding.Unicode) || Equals(fileEncoding, Encoding.BigEndianUnicode)) { // 自己来操作 cancel = true; // 如果是另存为,那么需要获取另存为的文件名,所以要自己显示另存为保存框 if (saveasui) { FileDialog fileDialog = app.FileDialog[MsoFileDialogType.msoFileDialogSaveAs]; fileDialog.InitialFileName = wb.Name; fileDialog.AllowMultiSelect = false; fileDialog.Title = "另存为"; FileDialogFilters fileDialogFilters = fileDialog.Filters; bool flag = false; for (int i = 1; i <= fileDialogFilters.Count; i++) { if ("*.csv".Equals(fileDialogFilters.Item(i).Extensions)) { flag = true; fileDialog.FilterIndex = i; break; } } if (!flag) { fileDialogFilters.Add("CSV (逗号分隔)", "*.csv"); fileDialog.FilterIndex = fileDialogFilters.Count; } // 取消了操作 if (fileDialog.Show() == 0) { return; } string fileNewName = fileDialog.SelectedItems.Item(1); if (!fileNewName.ToLower().EndsWith(".csv")) { // 非csv则普通保存,需要标志一下,否则会再进来,因为文件名是同一个 flagSaveAs = true; wb.SaveAs(fileNewName); return; } fileDict[fileNewName] = fileEncoding; fileName = fileNewName; } app.ScreenUpdating = false; // 取值 StringBuilder sb = new StringBuilder(); Worksheet sheet = wb.ActiveSheet; Range range = sheet.UsedRange; int row = range.Rows.Count; int col = range.Columns.Count; object[,] tmp = sheet.UsedRange.Value; for (int i = 1; i <= row; i++) { for (int j = 1; j <= col; j++) { if (j != 1) { sb.Append(','); } var obj = tmp[i, j]; if (obj == null) { continue; } var val = obj.ToString(); if (!string.IsNullOrEmpty(val)) { sb.Append(ConvertToCsvCellString(val)); } } if (i != row) { sb.AppendLine(string.Empty); } } var win = wb.Windows[1]; range = win.ActiveCell; row = range.Row; col = range.Column; int scrollRow = win.ScrollRow; int scrollCol = win.ScrollColumn; // 如果异常,就不用再打开单元簿 bool canClose = reOpen; try { wb.Saved = true; wb.Close(false); } catch { canClose = false; } // 保存带编码的csv using (StreamWriter sw = new StreamWriter(fileName, false, fileEncoding)) { sw.Write(sb.ToString()); sw.Close(); sw.Dispose(); } if (canClose) { wb = app.Workbooks.Open(fileName); app.ScreenUpdating = false; sheet = wb.ActiveSheet; sheet.UsedRange.Columns.NumberFormat = "@"; sheet.UsedRange.Value = tmp; // 设置成文本格式后,需要再赋值,否则会出现科学计数 sheet.Cells[row, col].Select(); wb.Windows[1].ScrollColumn = scrollCol; wb.Windows[1].ScrollRow = scrollRow; wb.Saved = true; } app.ScreenUpdating = true; } }