//using NPOI.HSSF.UserModel;
//using NPOI.XSSF.UserModel;
//using System;
//using System.IO;
//using System.Linq;
//namespace Uninpho.Tools
//{
// ///
// /// xls转为xlsx
// ///
// class NPOIExt
// {
// public static void ConvertToXlsx(string xlsPath, string newExcelPath)
// {
// using (var streamRead = new FileStream(xlsPath, FileMode.Open, FileAccess.Read))
// using (var streamWrite = new FileStream(newExcelPath, FileMode.OpenOrCreate, FileAccess.Write))
// {
// var book = new HSSFWorkbook(streamRead);
// var newBook = new HSSFWorkbook();
// var copiedSheets = Enumerable.Range(0, book.NumberOfSheets).Select(i => book.CloneSheet(i));
// copiedSheets.Select((sheet, index) => new { sheet, index }).ToList()
// .ForEach(item => newBook.Insert(item.index, item.sheet));
// newBook.Write(streamWrite);
// }
// #region MyRegion
// //var oldWorkbook = new HSSFWorkbook(new FileStream(xlsPath, FileMode.Open));
// //var oldWorkSheet = oldWorkbook.GetSheetAt(0);
// //int m = 0;
// //try
// //{
// // using (var fileStream = new FileStream(newExcelPath, FileMode.Create))
// // {
// // var newWorkBook = new XSSFWorkbook();
// // var newWorkSheet = newWorkBook.CreateSheet("Sheet1");
// // int i = 0;
// // foreach (HSSFRow oldRow in oldWorkSheet)
// // {
// // var newRow = newWorkSheet.CreateRow(oldRow.RowNum);
// // for (int ii = oldRow.FirstCellNum; ii < oldRow.Cells.Count; ii++)
// // {
// // m = ii;
// // var newCell = newRow.CreateCell(ii);
// // var ddd = oldRow.Cells[ii];
// // newCell.SetCellValue( /*GetValueType()*/ddd.ToString());
// // }
// // }
// // int sheetMergerCount = oldWorkSheet.NumMergedRegions;
// // for (int me = 0; me < sheetMergerCount; me++)
// // newWorkSheet.AddMergedRegion(oldWorkSheet.GetMergedRegion(me));
// // newWorkBook.Write(fileStream);
// // newWorkBook.Close();
// // }
// //}
// //catch (Exception ex)
// //{
// // int b = m;
// // throw;
// //}
// //oldWorkbook.Close();
// //return newExcelPath;
// #endregion
// }
// }
//}
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.HSSF.UserModel;
using System.Collections.Generic;
using System.Linq;
using System.IO;
namespace Uninpho.Tools
{
public static class NPOIExt
{
public static bool ConvertToXlsx(string xlsPath, string newExcelPath)
{
var streamRead = new FileStream(xlsPath, FileMode.Open, FileAccess.Read);
var pReadByte = Convert(streamRead);
FileStream pFileStream = null;
try
{
pFileStream = new FileStream(newExcelPath, FileMode.OpenOrCreate);
pFileStream.Write(pReadByte, 0, pReadByte.Length);
}
catch
{
return false;
}
finally
{
if (pFileStream != null)
pFileStream.Close();
}
return true;
}
private static byte[] Convert(Stream sourceStream)
{
var source = new HSSFWorkbook(sourceStream);
var destination = new XSSFWorkbook();
for (int i = 0; i < source.NumberOfSheets; i++)
{
var xssfSheet = (XSSFSheet)destination.CreateSheet(source.GetSheetAt(i).SheetName);
var hssfSheet = (HSSFSheet)source.GetSheetAt(i);
CopyStyles(hssfSheet, xssfSheet);
CopySheets(hssfSheet, xssfSheet);
}
using (var ms = new MemoryStream())
{
destination.Write(ms);
return ms.ToArray();
}
}
private static void CopyStyles(HSSFSheet from, XSSFSheet to)
{
for (short i = 0; i <= from.Workbook.NumberOfFonts; i++)
{
CopyFont(to.Workbook.CreateFont(), from.Workbook.GetFontAt(i));
}
for (short i = 0; i < from.Workbook.NumCellStyles; i++)
{
CopyStyle(to.Workbook.CreateCellStyle(), from.Workbook.GetCellStyleAt(i), to.Workbook, from.Workbook);
}
}
private static void CopyFont(IFont toFront, IFont fontFrom)
{
toFront.Boldweight = fontFrom.Boldweight;
toFront.Charset = fontFrom.Charset;
toFront.Color = fontFrom.Color;
toFront.FontHeightInPoints = fontFrom.FontHeightInPoints;
toFront.FontName = fontFrom.FontName;
toFront.IsBold = fontFrom.IsBold;
toFront.IsItalic = fontFrom.IsItalic;
toFront.IsStrikeout = fontFrom.IsStrikeout;
//toFront.Underline = fontFrom.Underline; <- bug in npoi setter
}
private static void CopyStyle(ICellStyle toCellStyle, ICellStyle fromCellStyle, IWorkbook toWorkbook, IWorkbook fromWorkbook)
{
toCellStyle.Alignment = fromCellStyle.Alignment;
toCellStyle.BorderBottom = fromCellStyle.BorderBottom;
toCellStyle.BorderDiagonal = fromCellStyle.BorderDiagonal;
toCellStyle.BorderDiagonalColor = fromCellStyle.BorderDiagonalColor;
toCellStyle.BorderDiagonalLineStyle = fromCellStyle.BorderDiagonalLineStyle;
toCellStyle.BorderLeft = fromCellStyle.BorderLeft;
toCellStyle.BorderRight = fromCellStyle.BorderRight;
toCellStyle.BorderTop = fromCellStyle.BorderTop;
toCellStyle.BottomBorderColor = fromCellStyle.BottomBorderColor;
toCellStyle.DataFormat = fromCellStyle.DataFormat;
toCellStyle.FillBackgroundColor = fromCellStyle.FillBackgroundColor;
toCellStyle.FillForegroundColor = fromCellStyle.FillForegroundColor;
toCellStyle.FillPattern = fromCellStyle.FillPattern;
toCellStyle.Indention = fromCellStyle.Indention;
toCellStyle.IsHidden = fromCellStyle.IsHidden;
toCellStyle.IsLocked = fromCellStyle.IsLocked;
toCellStyle.LeftBorderColor = fromCellStyle.LeftBorderColor;
toCellStyle.RightBorderColor = fromCellStyle.RightBorderColor;
toCellStyle.Rotation = fromCellStyle.Rotation;
toCellStyle.ShrinkToFit = fromCellStyle.ShrinkToFit;
toCellStyle.TopBorderColor = fromCellStyle.TopBorderColor;
toCellStyle.VerticalAlignment = fromCellStyle.VerticalAlignment;
toCellStyle.WrapText = fromCellStyle.WrapText;
toCellStyle.SetFont(toWorkbook.GetFontAt((short)(fromCellStyle.GetFont(fromWorkbook).Index + 1)));
}
private static void CopySheets(HSSFSheet source, XSSFSheet destination)
{
var maxColumnNum = 0;
var mergedRegions = new List();
var styleMap = new Dictionary();
for (int i = source.FirstRowNum; i <= source.LastRowNum; i++)
{
var srcRow = (HSSFRow)source.GetRow(i);
var destRow = (XSSFRow)destination.CreateRow(i);
if (srcRow != null)
{
CopyRow(source, destination, srcRow, destRow, mergedRegions);
if (srcRow.LastCellNum > maxColumnNum)
{
maxColumnNum = srcRow.LastCellNum;
}
}
}
for (int i = 0; i <= maxColumnNum; i++)
{
destination.SetColumnWidth(i, source.GetColumnWidth(i));
}
}
private static void CopyRow(HSSFSheet srcSheet, XSSFSheet destSheet, HSSFRow srcRow, XSSFRow destRow, List mergedRegions)
{
destRow.Height = srcRow.Height;
for (int j = srcRow.FirstCellNum; srcRow.LastCellNum >= 0 && j <= srcRow.LastCellNum; j++)
{
var oldCell = (HSSFCell)srcRow.GetCell(j);
var newCell = (XSSFCell)destRow.GetCell(j);
if (oldCell != null)
{
if (newCell == null)
{
newCell = (XSSFCell)destRow.CreateCell(j);
}
CopyCell(oldCell, newCell);
var mergedRegion = GetMergedRegion(srcSheet, srcRow.RowNum,
(short)oldCell.ColumnIndex);
if (mergedRegion != null)
{
var newMergedRegion = new CellRangeAddress(mergedRegion.FirstRow,
mergedRegion.LastRow, mergedRegion.FirstColumn, mergedRegion.LastColumn);
if (IsNewMergedRegion(newMergedRegion, mergedRegions))
{
mergedRegions.Add(newMergedRegion);
destSheet.AddMergedRegion(newMergedRegion);
}
}
}
}
}
private static void CopyCell(HSSFCell oldCell, XSSFCell newCell)
{
CopyCellStyle(oldCell, newCell);
CopyCellValue(oldCell, newCell);
}
private static void CopyCellValue(HSSFCell oldCell, XSSFCell newCell)
{
switch (oldCell.CellType)
{
case CellType.String:
newCell.SetCellValue(oldCell.StringCellValue);
break;
case CellType.Numeric:
newCell.SetCellValue(oldCell.NumericCellValue);
break;
case CellType.Blank:
newCell.SetCellType(CellType.Blank);
break;
case CellType.Boolean:
newCell.SetCellValue(oldCell.BooleanCellValue);
break;
case CellType.Error:
newCell.SetCellErrorValue(oldCell.ErrorCellValue);
break;
case CellType.Formula:
newCell.SetCellFormula(oldCell.CellFormula);
break;
default:
break;
}
}
private static void CopyCellStyle(HSSFCell oldCell, XSSFCell newCell)
{
if (oldCell.CellStyle == null) return;
newCell.CellStyle = newCell.Sheet.Workbook.GetCellStyleAt((short)(oldCell.CellStyle.Index + 1));
}
private static CellRangeAddress GetMergedRegion(HSSFSheet sheet, int rowNum, short cellNum)
{
for (var i = 0; i < sheet.NumMergedRegions; i++)
{
var merged = sheet.GetMergedRegion(i);
if (merged.IsInRange(rowNum, cellNum))
{
return merged;
}
}
return null;
}
private static bool IsNewMergedRegion(CellRangeAddress newMergedRegion,
List mergedRegions)
{
return !mergedRegions.Any(r =>
r.FirstColumn == newMergedRegion.FirstColumn &&
r.LastColumn == newMergedRegion.LastColumn &&
r.FirstRow == newMergedRegion.FirstRow &&
r.LastRow == newMergedRegion.LastRow);
}
}
}